Javascript — простые упражнения

#javascript #arrays #function #math

#javascript #массивы #функция #математика

Вопрос:

У меня есть задача написать функцию getEvenAverage , которая должна принимать только один аргумент — массив. Эта функция должна return получать среднее значение четных чисел из этого массива. Если в массиве нет четных чисел, функция должна вернуть null .

Я был бы очень признателен за любую обратную связь 🙂

 function getEvenAverage(tab) {
  {
    if (i % 2 === 0) {
      for (var i = 0; i < tab.length; i  ) {
        sum  = parseInt(tab[i], 10);
      }
      var avg = sum / tab.length;
    } else
      console.log('null');
  }
}
  

Комментарии:

1. Ваша функция ничего не возвращает

2.Я думаю, вам чего-то не хватает в вашем примере? слишком много фигурных скобок ( { } )

3. Не используйте var , используйте let вместо этого! (Это напрямую покажет вам некоторые из допущенных вами ошибок)

4. @emil несколько дополнительных инструкций блока действительно сбивают с толку, но они не меняют способ работы кода 🙂

Ответ №1:

Вы говорите, что вам нужно что-то вернуть, поэтому return это. Также переместите свой if оператор внутри вашего for цикла и исправьте несколько других синтаксических ошибок. И, как указано в комментариях, вы должны разделить sum на количество четных чисел, чтобы получить свой avg :

 function getEvenAverage(tab) {
  var sum = 0;
  var evens = 0;
  for (var i = 0; i < tab.length; i  ) {
    if (i % 2 === 0) {
      sum  = parseInt(tab[i], 10);
      evens  ;
    } 
  }
  if (evens == 0) {
    console.log("null");
    return null;
  } else {
    var avg = sum / evens;
    return avg;
  }
}

console.log(getEvenAverage([1, 2, 3]));  

Комментарии:

1. я думаю, вам не следует делить на tab.length , а на то, сколько четных чисел было

2. О да, мой плохой @giorgim.

3. Исправлено сейчас @giorgim, есть что-нибудь лучше?

4. Я согласен, я просто придерживался идеи OP о том, что должен делать их код.

5. Да, @mrdeadsven, я добавлю это.

Ответ №2:

Вы также могли бы сделать это с помощью уменьшения массива, с помощью одного обхода массива

 const reducer = (acc, val) => {
  let {
    sum,
    count
  } = acc;
  return (val % 2 === 0 ? {
    sum: sum   val,
    count: count   1
  } : acc);
};

const getEvenAverage = (input) => {
  const initialValue = {
    sum: 0,
    count: 0
  };
  const output = input.reduce(reducer, initialValue);

  if (output.count === 0) {
    return null;
  } else {
    return output.sum / output.count;
  }
};

console.log(getEvenAverage([1, 2, 3]));  

Ответ №3:

Вот правильная функция.

 function getEvenAverage(tab) {
    var sum = 0, count = 0;
    for (var i = 0; i < tab.length; i  ) {
      if (i % 2 === 0) {
        sum  = parseInt(tab[i], 10);
        count  ;
      }
    } 
    if(sum > 0)
      return (sum / count);
    return null;
}
  

Желаю вам счастливого кодирования.

Ответ №4:

Помимо использования цикла for, вы можете использовать методы фильтрации и сокращения массива.

 function getEvenAverage(arr) {
  const newArr = arr.filter(number => number % 2 === 0);
  return newArr.length > 0 ? newArr.reduce((acc, num) => acc   num) / newArr.length : null;
}

console.log(getEvenAverage([1, 2, 3, 4]));
console.log(getEvenAverage([1, 3, 5, 7]));  

Ответ №5:

Попробуйте эту функцию,

 function getEvenAverage(tab) {
        var numberOfEvens = 0;
        var sum = 0;
        for(var i=0;i<tab.length;i  ){
             if(tab[i]%2 == 0 ){
                 numberOfEvens  ;
                 sum  = tab[i];
             }
        }
        if(numberOfEvens == 0)return null;
        return sum/numberOfEvens;
    }
    
    console.log(getEvenAverage([0,1,2,3,4,5]))
    console.log(getEvenAverage([1,2,3,4,5]))
    console.log(getEvenAverage([0,1,11,3,4,5]))
    console.log(getEvenAverage([1,5,3]))  

Комментарии:

1. Вы получаете неверный результат для последнего примера массива. 0 — четное число, и среднее значение должно быть 0.

Ответ №6:

Вам нужны только четные числа, поэтому сначала filter преобразуйте массив в новый массив, затем суммируйте все числа (с помощью reduce или цикла for) и разделите на его длину.

 function getEvenAverage(array) {
  if (!Array.isArray(array)) return null; // not a must if you're sure you pass an array
  var evenArray = array.filter(function(value) {
    return value % 2 === 0
  });
  if (evenArray.length === 0) return null;
  var evenSum = evenArray.reduce(function(total, current) {
    return total   current;
  });
  var evenAvg = evenSum / evenArray.length;
  return evenAvg;
}

console.log(getEvenAverage("not an array"));
console.log(getEvenAverage([1,3,7])); // no even numbers
console.log(getEvenAverage([1,2,3])); // single even number
console.log(getEvenAverage([2,2,2])); // only even numbers
console.log(getEvenAverage([1,2,3,10,18])); // bigger array
console.log(getEvenAverage([0,1])); // 0 is also even  

Ответ №7:

 function getEvenAverage(arr){
  var evenNumbers = []; // we use an array to hold all of our evenNumbers
  for  (var el of arr){ // we loop over the received array to check the received
    if(el % 2 !=0){ // if the number is even
      evenNumbers.push(el); // we add it to our evenNumbers array
    }
  }
  if(evenNumbers.length == 0){ // when we have no even Number
    return false; // we then return false
  }
  else{
    // the next block of code calculates the average of the even values
    return evenNumbers.reduce((pv,cv) => pv cv,0)/evenNumbers.length;
  }
}

var evenNumbers = [4,2,3,6,5,9];
getEvenAverage(evenNumbers); // returns 5.666666666666667
getEvenAverage([2,4,6,8]); // returns false