Я получаю NaN в результате рядом с числом в последней функции - PullRequest
1 голос
/ 29 февраля 2020
var john  = {
name: 'John Smith',
bills: [124,48,268,180,42],
tips : [],
final: [],
calcTips: function(){
    for(i = 0; i < this.bills.length;i++){
        if(this.bills[i] < 50){
            this.tips[i] = this.bills[i] * 0.2;
            this.final[i] = this.bills[i] + this.tips[i];
        } else if(this.bills[i] >= 50 && this.bills[i] <= 200){
            this.tips[i] = this.bills[i] * 0.15;
            this.final[i] = this.bills[i] + this.tips[i];
        } else{
            this.tips[i] = this.bills[i] * 0.1;
            this.final[i] = this.bills[i] + this.tips[i];
        }
    }
}

};

var mark  = {
name: 'Mark Smith',
bills: [77,375,110,45],
tips : [],
final: [],
calcTips: function(){
    for(i = 0; i < this.bills.length;i++){
        if(this.bills[i] < 100){
            this.tips[i] = this.bills[i] * 0.2;
            this.final[i] = this.bills[i] + this.tips[i];
        } else if(this.bills[i] >= 100 && this.bills[i] <= 300){
            this.tips[i] = this.bills[i] * 0.1;
            this.final[i] = this.bills[i] + this.tips[i];
        } else{
            this.tips[i] = this.bills[i] * 0.25;
            this.final[i] = this.bills[i] + this.tips[i];
        }
    }
}

};

function calcAverage(tips){
var sum = 0;
for(i = 0; i < tips.length ; i++){
    sum = tips[i] + sum;
}
return sum / tips.length;

}

mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);
mark.calcTips();
john.calcTips();
console.log(john);
console.log(mark);

функция calcAverage возвращает значение NaN, превышающее среднее число. я закодировал его так, что он будет l oop массива подсказок и добавит к переменной суммы подсказки плюс сумму. кто-нибудь может объяснить проблему?

Ответы [ 4 ]

0 голосов
/ 29 февраля 2020

Проблема заключается в привязке « this » при вызове этой функции. вы можете видеть, что calcTips был вызван с использованием apply () , однако я извлек эту функцию только для демонстрационных целей; этот код еще можно улучшить, но он не сильно изменился, чтобы вы могли видеть, что происходит;

Проверьте фрагмент кода:

var john = {
  name: "John Smith",
  bills: [124, 48, 268, 180, 42],
  tips: [],
  final: []
};

var mark = {
  name: "Mark Smith",
  bills: [77, 375, 110, 45],
  tips: [],
  final: []
};

function calcTips() {
  for (let i = 0; i < this.bills.length; i++) {
    if (this.bills[i] < 100) {
      this.tips[i] = this.bills[i] * 0.2;
      this.final[i] = this.bills[i] + this.tips[i];
    } else if (this.bills[i] >= 100 && this.bills[i] <= 300) {
      this.tips[i] = this.bills[i] * 0.1;
      this.final[i] = this.bills[i] + this.tips[i];
    } else {
      this.tips[i] = this.bills[i] * 0.25;
      this.final[i] = this.bills[i] + this.tips[i];
    }
  }
}

function calcAverage(tips) {
  var sum = 0;
  for (i = 0; i < tips.length; i++) {
    sum = tips[i] + sum;
  }
  return sum / tips.length;
}

//calling calcTips with "this" refers to mark 
calcTips.apply(mark);

//calling calcTips with "this" refers to john 
calcTips.apply(john);

mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);
console.log(john);
console.log(mark);
0 голосов
/ 29 февраля 2020

Насколько я вижу, средний совет рассчитывается до того, как советы действительно существуют. Если вы перенесете расчет подсказок выше, он должен работать нормально:

mark.calcTips();
john.calcTips();
mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);
console.log(john);
console.log(mark);
0 голосов
/ 29 февраля 2020

попробуйте вызвать эти функции

mark.calcTips(); john.calcTips();

до

mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);

, так как подсказки - это пустой массив при вызове функции calcAverage ()

код должен быть

mark.calcTips();
john.calcTips(); 
mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);
0 голосов
/ 29 февраля 2020

Вы звоните calcAverage до , звоните calcTips, поэтому массивы пусты. calcAverage оканчивается на return sum / tips.length. Поскольку sum равно 0, а tips.length равно 0, это NaN (в JavaScript, 0/0 равно NaN, поскольку JavaScript использует IEEE 754 с плавающей запятой двойной точности, которая указывает, что поведение).

Чтобы исправить это:

  1. Не делите sum, когда tips.length равно 0, и
  2. Рассчитайте чаевые перед вычислением средний.
...