Javascript / ES6 forEach Issue

时间:2018-03-23 03:01:57

标签: javascript ecmascript-6

我正在尝试遍历Array Objects,修改每个Object,并将结果推送到新的Array

数组中的Objects具有不同的值。当我检查结果Array时,所有Objects都具有相同的值。它们都反映了原始Object

中的最后Array

例如:

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' } 
]

5 个答案:

答案 0 :(得分:4)

  

我正在尝试遍历一个对象数组,修改每个对象,并将结果推送到一个新的数组中。

听起来像你想要的是.map,而不是.forEach

  

当我检查生成的数组时,所有对象都具有相同的值。它们都反映了原始数组中的最后一个对象

这是因为Object.assign 修改了对象。您正在多次修改a并创建一个包含多个a引用的数组。

答案是将一个空对象作为第一个参数传递给Object.assign(并使用map)。 {...item}的使用也毫无意义,因此我将其替换为item

const a = { choo: 'choo' }
const b = [ { foo: 'bar' }, { foo: 'baz' }, { foo: 'foo' } ]

const c = b.map((item) => Object.assign({}, a, item));

console.log(c);

编辑如果您确实想要修改原始对象,可以通过将参数的顺序更改为Object.assign来实现,以便{ {1}}是第一个。我不建议这样做:

item

答案 1 :(得分:1)

是的,这就是Object.assign的工作原理:它修改目标并返回它,它不会创建新对象。您的所有结果都会引用您作为目标传递的a

您正在寻找

const c = b.map(item => ({...a, ...item})); // with object spread syntax

const c = b.map(item => Object.assign({}, a, item)); // with Object.assign

答案 2 :(得分:0)

b.forEach((item) => {
  c.push(Object.assign(a, {...item} ));
});

不是{...b},必须是{...item}

答案 3 :(得分:0)

问题在于{...b} - 您只需复制b中对象的所有属性,当您只想复制项目的属性时#&# 39;重复迭代。



const a = { choo: 'choo' }
const b = [ { foo: 'bar' }, { foo: 'baz' }, { foo: 'foo' } ]
const c = [];
b.forEach((item) => {
  c.push(Object.assign(item, a));
});
console.log(c);




您还希望Object.assign的第一个参数成为您正在变异的对象。

答案 4 :(得分:0)

Object.assign ,此功能会更改对象,并返回对象a 的引用。

这意味着,您将对象改为,并在每个循环中将其引用推送到 array c

最后,您将获得包含对象a的三个引用的数组c。这一刻,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 ));
});