修改通过引用传递的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)};
}