Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Array.reduce中使用对象分解_Javascript_Ecmascript 6_Ecmascript Harmony - Fatal编程技术网

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
}

*/
Array
reduce
通常用于返回新值。即使它变异了累加器,也可以安全地假设它可以返回一个新值

arr.reduce(reducer,obj)
依赖于
obj
突变
reducer2
确实改变了原始对象,这就是它工作的原因。但这与保持累加器不变的
reducer
相矛盾

应该是:

obj = arr.reduce(reducer, obj);

Object.assign(acc
不创建新数组,…
…acc
创建新数组。使用
…{…}
没有任何意义。只需将属性直接放在对象文本中。我过去认为,在每个循环步骤中,
reducer
返回的任何内容都会成为新的
acc
@connexo,但obj仍然指向原始对象,……这就是object.assign工作的原因,因为它仍然在原始对象上工作。
objarr.reduce(reducer,obj)
时,code>不是通过引用传递的?@connexo它能够返回新的acc,但是在reducer2的每次迭代中返回相同的对象,在reducer中返回新的对象。
object.assign(obj)==obj
{…obj}!==obj
(这是
object assign.assign({},obj)
的语法糖)。因此obj不是通过引用传递的
它是通过引用传递的,而是在传递时替换它。
{…acc}
,并且由于您不再使用reduce的返回,因此原始对象保持不变。