Функция для свойства объекта возвращает NaN - PullRequest
0 голосов
/ 03 октября 2018

У меня проблемы с пониманием JS-логики в следующем примере.Я создал объект «x» со свойством «bills», которое является массивом.В том же объекте я добавил метод «tipCalc», который создает два дополнительных свойства для x.Первое свойство - это массив «tips».В «подсказках» каждый элемент «счета» умножается на 0,2, 0,15 или 0,1;Второе свойство - это массив «затрат».В разделе «затраты» каждый элемент «счета» добавляется к каждому элементу «подсказки».Когда я затем печатаю объект в консоль, оба элемента "tips" и "cost" имеют элементы.Тем не менее, когда я пытаюсь вычислить среднее значение элементов в массиве «tips» в функции averageCalc и передаю «x.tips» в качестве аргумента, функция возвращает NaN.Может кто-нибудь объяснить мне, почему функция, которая должна возвращать среднее значение, вместо этого возвращает NaN?Заранее спасибо!

var x = {
    bills: [124, 48, 268, 180, 42],
    tipCalc: function() {
        this.tips = [];
        this.costs = [];
        for (var i = 0; i < this.bills.length; i++) {
            if (this.bills[i] < 50) {
                this.tips[i] = this.bills[i] * 0.2;
            } else if (this.bills[i] > 50 && this.bills[i] < 200) {
                this.tips[i] = this.bills[i] * 0.15;
            } else {
                this.tips[i] = this.bills[i] * 0.1;
            }
            this.costs[i] = this.bills[i] + this.tips[i]
        }
    }
}


x.tipCalc();

function averageCalc(arr) {
    var sum = "";
    var average = "";
    for (i = 0; i < arr.length; i++) {
        sum = sum + arr[i];
        average = sum / arr.length;
    }
    return average
}


var j = averageCalc(x.tips);
console.log(j);

1 Ответ

0 голосов
/ 03 октября 2018

Мне кажется, что проблема заключается в функции averageCalc.Вы инициализируете и sum, и average как пустую строку.Это означает, что последующие добавления находятся между числом и строкой - и в таких случаях JS всегда приводит число к строке.С одной стороны, это означает, что сумма будет неправильной (так как она будет получена путем объединения чисел в виде строк).Но более того, когда вы делите эту строку на другую строку, JS не знает, как с этим справиться, но знает, что не может обработать деление строки на число, поэтому возвращает NaN.И именно поэтому вы получаете результат, который вы делаете.

Итак, инициализируйте sum и average с 0, и все будет в порядке.(Хотя вообще не нужно инициализировать average, вам не нужно работать с этим, пока вы не добавите массив.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...