修改通过引用传递的calculateLineTotals()中的值是不好的做法吗?如果是这样,我是否需要克隆一条线然后返回?

下面的示例演示:



const data = {
  lines: [
    {
      Title: "Item One",
      Size: "Large",
      ProductId: "5535-43",
      Price: 10,
      TotalIncTax: 0,
      TotalExclTax: 0,
      Tax: 0,
      TaxPercent: 20,
      Qty: 2,
    }
  ]
};

function calculateData(data) {
  for(const line of data.lines) {
    calculateLineTotals(line);
  }

  return data;
}

function calculateLineTotals(line) {
  const qty = line.Qty
  const price = line.Price;
  const taxRate =  line.TaxPercent;

  const totalIncTax = price * qty;
  const totalExclTax = totalIncTax / ((taxRate + 100) / 100);
  const tax = (totalIncTax - totalExclTax);

  line.TotalIncTax = totalIncTax;
  line.TotalExclTax = totalExclTax;
  line.Tax = tax;

  return line;
}

console.log(calculateData(data));

最佳答案

修改通过引用传递的calculateLineTotals()中的值是不好的做法吗?


不必要。这取决于您的应用程序用例。如果您仍然不需要原始数据,则对它进行突变是完全可以的。在您的示例中,写入的属性似乎是空的(值为0),最好有一个函数来填充结果。尽管如此,还是最好对突变函数进行相应的命名和记录。您甚至可以删除return值,以使呼叫者清楚他不会获得新值。


  如果是这样,我是否需要克隆一条线然后返回?


是的,尽管使用现代的ES6语法,它不像是“克隆”,而更多的是创建全新的对象。

function calculateLineTotals(line) {
  const {Qty: qty, Price: price, TaxPercent: taxRate} = line;

  const totalIncTax = price * qty;
  const totalExclTax = totalIncTax / ((taxRate + 100) / 100);
  const tax = (totalIncTax - totalExclTax);

  return {...line, TotalIncTax: totalIncTax, TotalExclTax: totalExclTax, Tax: tax};
}

function calculateData(data) {
  return {lines: data.lines.map(calculateLineTotals)};
}

10-06 00:26