繁体   English   中英

如何防止突变

[英]How to prevent mutation

我一直在尝试编写一个计算混合账单的函数,使用 ES6 没有 MUTATION。
我在下面有一个代码,它的作用是,它需要一群人给钱,将它们全部相加以获得总金额,然后循环然后除以用户的长度以获得它的数量每人。 然后我从用户数量中减去人均份额,因此列表包含负/正或 0,具体取决于他们对总账单的贡献。 然后为大于 0 和小于 0 的人过滤用户,以提取负数和正数。

到目前为止,代码工作正常并且输出符合我的预期,但是我使用的是不断变化的 let 变量,这导致我理解的突变,是否有任何其他方法可以防止此代码中的突变,

您可以在代码片段上查看代码

 const users = [ { id: 1, username: "John One", amount: 50 }, { id: 2, username: "John Two", amount: 75 }, { id: 3, username: "John Three", amount: 100 }, { id: 4, username: "John Four", amount: 125 }, { id: 5, username: "John five", amount: 150 }, { id: 6, username: "John six", amount: 50 }, { id: 7, username: "John seven", amount: 150 }, { id: 8, username: "John eight", amount: 250 }, { id: 9, username: "John nine", amount: 150 }, { id: 10, username: "John Ten", amount: 100 }, ] const total = users.reduce((acc, user) => acc + user.amount, 0); const perPersonShare = total / users.length; const sortedUsers = users.map((user) => { return { ...user, amount: user.amount - perPersonShare, hasToPay: [] } }); const negativeAmount = sortedUsers.filter(user => user.amount < 0); const positiveAmount = sortedUsers.filter(user => user.amount > 0); const res = positiveAmount.reduce((acc, user) => { let balance = user.amount; return acc.map((ower) => { if (ower.amount === 0 || balance === 0) return ower; if (balance <= Math.abs(ower.amount)) { const updated = { ...ower, hasToPay: [...ower.hasToPay, { to: user.username, amount: balance }], amount: ower.amount + balance, }; balance = 0; return updated; } if (balance >= Math.abs(ower.amount)) { const updated = { ...ower, hasToPay: [...ower.hasToPay, { to: user.username, amount: Math.abs(ower.amount) }], amount: 0, }; balance = balance + ower.amount; return updated; } return ower; }); }, negativeAmount); console.log(JSON.stringify(res, 0, 2)) console.log(perPersonShare); console.log(total);

我是新手,所以我的答案可能有效或无效,但是您可以使用Object.freeze()来冻结对象,而不是使用数组来定义用户,您可以使用对象来定义它们。 这是根据我的理解

这是我发现的一些链接,它们可能对您有用

https://roclv.gitbooks.io/redux-getting-started/content/09.redux-avoiding-array-mutations-with-concat-slice-and-spread.html

https://medium.com/@fknussel/arrays-objects-and-mutations-6b23348b54aahttps://medium.com/@fknussel/arrays-objects-and-mutations-6b23348b54aa

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM