Javascript/ES6 forEach问题
我正在尝试遍历Javascript/ES6 forEach问题,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在尝试遍历对象的数组,修改每个对象,并将结果推送到新的数组 数组中的对象具有不同的值。当我检查生成的数组时所有对象都具有相同的值。它们都反映了原始数组中最后一个对象 例如: const a = { choo: 'choo' } const b = [ { foo: 'bar' }, { foo: 'baz' }, { foo: 'foo' } ] let c = []; b.forEach((item) => { c.push(Object.assign(a, {...item}
对象的数组
,修改每个对象
,并将结果推送到新的数组
数组中的对象
具有不同的值。当我检查生成的数组时
所有对象
都具有相同的值。它们都反映了原始数组中最后一个对象
例如:
const a = { choo: 'choo' }
const b = [ { foo: 'bar' }, { foo: 'baz' }, { foo: 'foo' } ]
let c = [];
b.forEach((item) => {
c.push(Object.assign(a, {...item} ));
});
c
的结果:
[
{ foo: 'foo', choo: 'choo' },
{ foo: 'foo', choo: 'choo' },
{ foo: 'foo', choo: 'choo' }
]
我假设这是某种范围问题,但我不确定如何解决它
预期结果将是:
[
{ foo: 'bar', choo: 'choo' },
{ foo: 'baz', choo: 'choo' },
{ foo: 'foo', choo: 'choo' }
]
非{…b}
,必须是{…item}
不是{…b}
,必须是{…item}
问题是您的{…b}
-您正在复制b
中对象的所有属性,而您只想复制迭代的项的属性
const a={choo:'choo'}
常量b=[{foo:'bar'},{foo:'baz'},{foo:'foo'}]
常数c=[];
b、 forEach((项目)=>{
c、 推(Object.assign(item,a));
});
控制台日志(c)
问题在于您的{…b}
-您正在复制b
中对象的所有属性,而您只想复制您正在迭代的项的属性
const a={choo:'choo'}
常量b=[{foo:'bar'},{foo:'baz'},{foo:'foo'}]
常数c=[];
b、 forEach((项目)=>{
c、 推(Object.assign(item,a));
});
控制台日志(c)代码>
我试图循环遍历一个对象数组,修改每个对象,并将结果推送到一个新数组中
听起来你想要的是.map
,而不是.forEach
当我检查结果数组时,所有对象都具有相同的值。它们都反射原始阵列中的最后一个对象
这是因为Object.assign
修改对象。您正在多次修改a
,并创建一个数组,其中包含对a
的多个引用
答案是将空对象作为第一个参数传递给object.assign
(并使用map
)。{…item}
的使用也毫无意义,因此我将其替换为item
:
const a={choo:'choo'}
常量b=[{foo:'bar'},{foo:'baz'},{foo:'foo'}]
const c=b.map((item)=>Object.assign({},a,item));
控制台日志(c)代码>
我试图循环遍历一个对象数组,修改每个对象,并将结果推送到一个新数组中
听起来你想要的是.map
,而不是.forEach
当我检查结果数组时,所有对象都具有相同的值。它们都反射原始阵列中的最后一个对象
这是因为Object.assign
修改对象。您正在多次修改a
,并创建一个数组,其中包含对a
的多个引用
答案是将空对象作为第一个参数传递给object.assign
(并使用map
)。{…item}
的使用也毫无意义,因此我将其替换为item
:
const a={choo:'choo'}
常量b=[{foo:'bar'},{foo:'baz'},{foo:'foo'}]
const c=b.map((item)=>Object.assign({},a,item));
控制台日志(c)
是的,这就是Object.assign
的工作原理:它修改并返回目标,但不创建新对象。所有结果都引用作为目标传递的a
你在找什么
const c = b.map(item => ({...a, ...item})); // with object spread syntax
或
是的,Object.assign
就是这样工作的:它修改目标并返回它,但不创建新对象。所有结果都引用作为目标传递的a
你在找什么
const c = b.map(item => ({...a, ...item})); // with object spread syntax
或
对象。分配,此函数将更改您的对象a,并返回对象a的引用
这意味着,在每个循环中更改对象a,并将其引用推送到数组c
最后,您将得到数组c,其中包括对象a的三个引用。此刻,a是{foo:foo',choo:choo'}
如何解决?
关键是,在每个循环中将不同的引用推送到数组c
const a = { choo: 'choo' }
const b = [ { foo: 'bar' }, { foo: 'baz' }, { foo: 'foo' } ]
let c = [];
b.forEach((item) => {
c.push(Object.assign({}, a, item ));
});
对象。分配,此函数将更改您的对象a,并返回对象a的引用
这意味着,在每个循环中更改对象a,并将其引用推送到数组c
最后,您将得到数组c,其中包括对象a的三个引用。此刻,a是{foo:foo',choo:choo'}
如何解决?
关键是,在每个循环中将不同的引用推送到数组c
const a = { choo: 'choo' }
const b = [ { foo: 'bar' }, { foo: 'baz' }, { foo: 'foo' } ]
let c = [];
b.forEach((item) => {
c.push(Object.assign({}, a, item ));
});
对不起,简化了我的问题代码,我使用的是{…item}
。我已经更新了问题对不起,简化了我的问题代码,我正在使用{…item}
。我已经更新了一个没有改变原始对象的问题,他说他确实想修改它。@CertainPerformance我猜OP只是用了一个很糟糕的词,但是很公平。我添加了一个附录。但这并没有改变原来的对象,他说他确实想修改它。@CertainPerformance我猜OP只是用了一个糟糕的词,但很公平。我增加了一个附录。