Почему эта функция портит значения в моем массиве? - PullRequest
0 голосов
/ 19 октября 2018

Когда я включаю функцию с именем tipAverage, значения для массива «tips» в объекте Mark неверны.Однако, когда я удаляю функцию tipAverage, значения верны.

Я пытаюсь понять, что происходит с кодом (т. Е. Поток управления).Может кто-нибудь сказать мне, почему и как функция tipAverage портит значения в множестве «подсказок» объекта Mark?Спасибо.

var tipJon = {
    fullName: "John Smith",
    billValues: [124, 48, 268, 180, 42],

    calcTipJon: function (){
        this.tips = [];
        this.totalBill = [];        

        for (var i = 0; i < this.billValues.length; i++){

        var percentage; 
            var bill = this.billValues[i]
        if (bill < 50){
            percentage = 0.2;
        } else if (bill >= 50 && bill<= 200){
            percentage = 0.15;
        } else if (bill> 200){
            percentage = 0.10;
        }

        this.tips[i] = this.billValues[i] * percentage;
        this.totalBill[i] = (this.billValues[i] * percentage) + this.billValues[i];

        }

    }    
}

var tipMark = {
    fullName: "Mark Miller",
    billValues: [77, 375, 110, 145],

    calcTipMark: function (){
        this.tips = [];
        this.totalBill = [];

        for (var i = 0; i < this.billValues.length; i++){

            var percentage; 
            var bill = this.billValues[i];

            if (bill < 100){
                percentage = 0.2;
            } else if (bill >= 100 && bill<= 300){
                percentage = 0.1;
            } else if (bill > 300){
                percentage = 0.25;
            }

            this.tips[i] = bill * percentage;
            this.totalBill[i] = bill + bill * percentage;
        }
    }
}

tipMark.calcTipMark();
console.log(tipMark);
tipJon.calcTipJon();
console.log(tipJon);


function tipAverage (arrayName){
    for (var i = 0; i < arrayName.length - 1; i++){
        //arrayName[i] = arrayName[i] + arrayName[i];
        arrayName[i] += arrayName[i + 1];
    }

    return arrayName[i] / arrayName.length; 
}

console.log("TIP AVERAGE " + tipAverage(tipMark.tips));

Ответы [ 2 ]

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

То, как ваш код вычисляет среднее значение, неверно.Он меняет почти каждое значение, но не может рассчитать сумму.

Вы можете правильно рассчитать среднее значение так:

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

Или, более функционально:

function tipAverage (arrayName){
    return arrayName.reduce((a,b) => a+b, 0)/arrayName.length;
}
0 голосов
/ 19 октября 2018

Массив передается как функция (по ссылке?) В функцию tipAverage.Поэтому, когда вы изменяете записи в параметре массива функций (например, arrayName[i] += arrayName[i + 1]), сам массив изменяется.Эти изменения будут видны за пределами функции tipAverage.

Лучше всего передать копию массива одним из множества способов:

console.log("TIP AVERAGE " + tipAverage(tipMark.tips.slice()));

Надеюсь, это поможет.

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