Javascript 在Array.reduce中使用对象分解
我试图用Javascript 在Array.reduce中使用对象分解,javascript,ecmascript-6,ecmascript-harmony,Javascript,Ecmascript 6,Ecmascript Harmony,我试图用Array.prototype.reduce和…object解构来解决另一个人的问题。我不明白为什么在使用Object.assign时它会按预期工作,但在使用spread运算符时却不能 const str='Jack:13,Phil:15,Lucy:12' 常量arr=str.split(',') 让减速器=(acc,val)=>{ 返回{…acc, ...{ [val.split(':')[0]]:编号(val.split(':')[1]) } } } 让减速器2=(acc,val)
Array.prototype.reduce
和…object
解构来解决另一个人的问题。我不明白为什么在使用Object.assign
时它会按预期工作,但在使用spread运算符时却不能
const str='Jack:13,Phil:15,Lucy:12'
常量arr=str.split(',')
让减速器=(acc,val)=>{
返回{…acc,
...{
[val.split(':')[0]]:编号(val.split(':')[1])
}
}
}
让减速器2=(acc,val)=>{
返回对象。分配(acc{
[val.split(':')[0]]:编号(val.split(':')[1])
})
}
设obj={
乔迪:29
}
设obj2={
朱莉:28
}
减速器(减速器,obj)
arr.reduce(减速器2,obj2)
控制台日志(obj)
/*输出:
{
“朱迪”:29岁
}
*/
console.log(obj2)
/*输出:
{
“朱莉”:28岁,
“杰克”:13岁,
“菲尔”:15岁,
“露西”:12
}
*/
Arrayreduce
通常用于返回新值。即使它变异了累加器,也可以安全地假设它可以返回一个新值
arr.reduce(reducer,obj)
依赖于obj
突变reducer2
确实改变了原始对象,这就是它工作的原因。但这与保持累加器不变的reducer
相矛盾
应该是:
obj = arr.reduce(reducer, obj);
Object.assign(acc
不创建新数组,……acc
创建新数组。使用…{…}
没有任何意义。只需将属性直接放在对象文本中。我过去认为,在每个循环步骤中,reducer
返回的任何内容都会成为新的acc
@connexo,但obj仍然指向原始对象,……这就是object.assign工作的原因,因为它仍然在原始对象上工作。obj当执行arr.reduce(reducer,obj)
时,code>不是通过引用传递的?@connexo它能够返回新的acc,但是在reducer2的每次迭代中返回相同的对象,在reducer中返回新的对象。object.assign(obj)==obj
,{…obj}!==obj
(这是object assign.assign({},obj)
的语法糖)。因此obj不是通过引用传递的
它是通过引用传递的,而是在传递时替换它。{…acc}
,并且由于您不再使用reduce的返回,因此原始对象保持不变。