为什么我的方法没有将结果推送到我的数组?

时间:2018-12-21 23:37:01

标签: javascript arrays object this

我创建了一个简单的对象。我正在尝试在对象上创建一种方法,该方法可处理一个数组中的数据并将数据推入两个新数组中。由于某些原因,新数据将不会填充两个新数组。当我运行方法john.tipCalc();时没有东西被推到我的空数组。

let john = {
  fullName: "John Smith",
  bills: [124, 48, 268, 180, 42],
  tips : [],
  finalBill : [],
  tipCalc: function() {
     this.bills.forEach(function(bill) {
       let percentage;
       if (bill < 50) {
          percentage = 0.2;
       } else if (bill >= 50 && bill <= 200) {
          percentage = 0.15;
       } else {
          percentage = 0.1;
       }
      this.tips = bill * percentage;
      this.finalBill = bill + bill * percentage;
    });
  }
};

我希望在“ tips”数组中填充在tipCalc方法中以bill *百分比计算的tip。然后,我要在“ finalBill”数组中填充帐单总额以及按帐单+帐单*百分比计算的小费百分比。

3 个答案:

答案 0 :(得分:4)

您需要push()进入tips。如果您想按如下方式使用() => {},还需要在forEach中使用箭头功能this.tips

let john = {
    fullName: "John Smith",
    bills: [124, 48, 268, 180, 42],
    tips : [],
    finalBill : 0,                  // shouldn't this be a single number?
    tipCalc: function() {
       this.bills.forEach(bill => { // use arrow function
         let percentage;
         if (bill < 50) {
            percentage = 0.2;
         } else if (bill >= 50 && bill <= 200) {
            percentage = 0.15;
         } else {
            percentage = 0.1;
         }
        this.tips.push(bill * percentage);    // push()!
        this.finalBill +=  bill * percentage; // add
      });
    }
  };

 john.tipCalc()
 console.log("Tips", john.tips)
 console.log("Final:", john.finalBill )

如果由于某些原因您无法使用箭头功能,则可以将this作为最终参数传递给forEach()

答案 1 :(得分:0)

您应该使用Array.push():

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push https://www.w3schools.com/jsref/jsref_push.asp

更正:

this.tips.push(bill * percentage);
this.finalBill.push(bill + bill * percentage);

答案 2 :(得分:0)

这里:

this.tips = bill * percentage;
this.finalBill = bill + bill * percentage;

您正在使用该操作的结果覆盖数组。

需要将其推送:

this.tips.push(bill * percentage);
this.finalBill.push(bill + bill * percentage);