Возврат NULL из пустого массива - PullRequest
0 голосов
/ 28 мая 2020

В настоящее время я изучаю основы c веб-разработки с JavaScript, проходя онлайн-курс по исправлению кода с помощью бота. Я пытаюсь реализовать функцию, которая вычисляет среднее значение массива.

let numbers = [1,2,3]
function average(array){
    var total = 0;
    var count = 0;

    array.forEach(function(item){
        total += item;
        count++;
    })    

    if (numbers.length > 0){
        return total / count; 
    } else if (numbers = ([])) {
        return null 
    }

}

На практике код работает нормально, но я получаю сообщение об ошибке: 1) defines average such that average([]) returns null, как если бы пустой массив отправлен, average([]) должен вернуть null Я не могу понять, как это исправить ...

Ответы [ 5 ]

1 голос
/ 28 мая 2020

Я бы сделал проще без счетчика. У вас есть общая длина массива.

Я также добавил версию, используя array.reduce () .

И, пожалуйста, не используйте числовую переменную внутри функции. Здесь нет смысла. Вы передаете переменную функции, и внутри функции вы должны использовать полученную переменную, иначе она будет вести себя некорректно. Внутри номера функции называется "arr", поэтому используйте arr полностью.

function average(arr){
    if (arr.length === 0) return null;

    let total = 0;
    arr.forEach(function(item){
        total += item;
    })
    return total / arr.length;
}

// using array.reduce() which makes more sense here
function average2(arr){
    if (arr.length === 0) return null;

    const total = arr.reduce(function(prev,next){
      return prev + next;
    });
    return total / arr.length;
}

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

console.log(average2([]));
console.log(average2([1,2,3]));
1 голос
/ 28 мая 2020

Вам не нужно проверять []. Если длина массива равна нулю, то он пуст:

let numbers = [1, 2, 3]

function average(array) {
  var total = 0;
  var count = 0;

  // No need to iterate over array if it's empty
  if (array.length > 0) {
    array.forEach(function(item) {
      total += item;
      count++;
    })
    return total / count;
  } else {
    // If we got here, array.length === 0
    return null
  }
}

console.log(average(numbers));
numbers = [];
console.log(average(numbers));
1 голос
/ 28 мая 2020

Во втором случае numbers = ([]) присваивает numbers значению [] (которое всегда возвращает true) вместо сравнения. Правильный способ - использовать == следующим образом:

let numbers = [1,2,3]
function average(array){
     var total = 0;
     var count = 0;
     array.forEach(function(item){
          total += item;
          count++;
     })    
     if (array.length > 0){
          return total / count; 
     } else if (array.length == 0) {
          return null 
     }
}
console.log(average(numbers));
numbers = [];
console.log(average(numbers));

EDIT:

Как упоминалось в комментарии, есть еще одна ошибка, когда вы используете numbers вместо array в функции.

0 голосов
/ 28 мая 2020
  • Вы используете числа вместо массива внутри метода average ().
  • Возможно, ваш массив может быть неопределенным. Попробуйте использовать это
function average(array) {
    if (typeof array == "object" && array.length > 0) {
        var total = 0;
        var count = 0;
        array.forEach(function(item) {
            total += item;
            count++;
        });
        return total / count;
    } else {
        return null;
    }
}
0 голосов
/ 28 мая 2020

Причина, по которой ваш тестовый пример не работает, заключается в том, что вы определяете numbers вверху, а затем повторно используете его в функции. Таким образом, он всегда возвращает одно и то же. Вместо этого вы должны использовать array внутри функции.

Вот краткая версия вашего скрипта, чтобы увидеть, на что способен js.

function average(array){
    let total = array.reduce((acc, value) => acc + value, 0);
    return array.length > 0 ? total / array.length : null;
}

console.log(average([1,2,3]))
console.log(average([]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...