修改引用传递的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));
答案 0 :(得分:1)
修改引用传递的
calculateLineTotals()
中的值是否是错误的做法?
不一定。这取决于您的应用程序用例。如果您仍然不需要原始数据,则对它进行突变是完全可以的。在您的示例中,写入的属性看起来是 empty (值为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)};
}