为什么此函数破坏数组中的值?

时间:2018-10-19 19:00:37

标签: javascript arrays function

当我包含一个名为tipAverage的函数时,Mark对象中数组“ tips”的值是错误的。但是,删除函数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 :(得分:2)

将数组本身(通过引用?)传递给tipAverage函数。因此,当您修改函式阵列参数(例如arrayName[i] += arrayName[i + 1])中的项目时,阵列本身就会变更。这些变化将在tipAverage函数之外看到。

您最好的选择是使用多种方法之一传递数组的副本:

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

希望这会有所帮助。

答案 1 :(得分:0)

您的代码计算平均值的方式是错误的。它几乎更改每个值,但无法计算总和。

您可以像这样正确计算平均值:

builder.Entity<UserNotifications>(entity =>
{
    entity.HasKey(n => n.Id);
    entity.HasOne(u => u.User)
          .WithOne(u => u.UserNotifications)
          .HasForeignKey<User>(u => u.Id);

    entity.HasOne(u => u.Sender)
          .WithOne(u => u.UserNotifications)
          .HasForeignKey<User>(u => u.Id);
 });

或者,功能更多:

console