javascript - Array.reduce 中对象解构的使用
问题描述
我试图解决另一个人关于 SO 使用Array.prototype.reduce
和...object
解构的问题。我不明白为什么它在我使用时按预期工作Object.assign
,但在使用传播运算符时却没有。
const str = 'Jack:13,Phil:15,Lucy:12'
const arr = str.split(',')
let reducer = (acc, val) => {
return { ...acc,
...{
[val.split(':')[0]]: Number(val.split(':')[1])
}
}
}
let reducer2 = (acc, val) => {
return Object.assign(acc, {
[val.split(':')[0]]: Number(val.split(':')[1])
})
}
let obj = {
Jody: 29
}
let obj2 = {
Julie: 28
}
arr.reduce(reducer, obj)
arr.reduce(reducer2, obj2)
console.log(obj)
/* output:
{
"Jody": 29
}
*/
console.log(obj2)
/* output:
{
"Julie": 28,
"Jack": 13,
"Phil": 15,
"Lucy": 12
}
*/
解决方案
数组reduce
通常用于返回一个新值。即使它改变了一个累加器,也可以安全地假设它可以返回一个新值。
arr.reduce(reducer, obj)
依赖那个obj
是变异的。reducer2
确实会改变原始对象,这就是它起作用的原因。但这与reducer
保持累加器不可变的条件相矛盾。
它应该是:
obj = arr.reduce(reducer, obj);
推荐阅读
- python - 如何在使用 Scrapy 跟踪一组网络抓取链接时结束递归
- python - 如何计算工作区中的对象数量?
- c - 如何包含必要的 kernel32.lib、标头 - 或在自定义应用程序中使用标准 dll?
- javascript - 两个异步函数和前两个执行后要执行的第三个函数
- maven - 从 Java 6、Ant 迁移到 Java 13、Maven
- ssl - Ubuntu openssl 创建的证书在浏览器中给出“不安全连接”
- c# - Itextsharp:添加新线型时如何避免替换现有线型?
- java - 如何在while循环外使用声明数组但在while循环中初始化它?
- php - Laravel:在 If 语句中正确使用 isset
- javascript - Promise.all 替换?