将键值(对象)对添加到数组中的所有对象

时间:2019-02-09 20:33:41

标签: javascript arrays function object ecmascript-6

我的问题与Add key value pair to all objects in array

有关

但是,当我尝试分配对象而不是字符串,整数等时,解决方案不起作用。

我试图在map函数中创建新的键,但是它仅适用于非对象变量。

这有效

arrObjects.map(item => item.newKey = 'xxx')

这不是

var obj = { a: 'a', b: 'b', c: 'c' }
arrObjects.map(item => item.newKey = obj)

输出:

var arrOfObj = [{
  name: 'eve'
}, {
  name: 'john'
}, {
  name: 'jane'
}];
var obj = {
  a: 'a',
  b: 'b',
  c: 'c'
}
arrOfObj.map(item => item.newKey = obj);

console.log(arrOfObj);
.as-console-wrapper { max-height: 100% !important; top: 0; }

4 个答案:

答案 0 :(得分:3)

您需要使用...(扩展运算符)

var arrOfObj = [{ name: 'eve' }, { name: 'john' }, { name: 'jane' }];
var obj = { a: 'a', b: 'b', c: 'c' };
arrOfObj.forEach(item => item.newKey = {...obj});

console.log(arrOfObj);
.as-console-wrapper { max-height: 100% !important; top: 0; }

或者,使用JSON

var arrOfObj = [{ name: 'eve' }, { name: 'john' }, { name: 'jane' }];
var obj = { a: 'a', b: 'b', c: 'c' };
arrOfObj.forEach(item => item.newKey = JSON.parse(JSON.stringify(obj)));

console.log(arrOfObj);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:2)

您需要创建对象的副本。默认情况下,对象被分配为参考。 这里...用于创建浅表副本

var arrOfObj = [{name: 'eve'}, {name: 'john'}, { name: 'jane'}];
var obj = { a: 'a', b: 'b', c: 'c'}

arrOfObj.forEach(item => (item.newKey = {...obj}));

console.log(arrOfObj);
.as-console-wrapper { max-height: 100% !important; top: 0; }

您可以看到一些用例here

答案 2 :(得分:2)

一种替代方法是使用Object.assign()。请记住,对象是通过引用的值复制的,这就是您的问题,而不是每个newKey都有一个新的对象,而是对同一个对象有多个引用。

var arrOfObj = [
  {name: 'eve'},
  {name: 'john'},
  {name: 'jane'}
];

var obj = { a: 'a', b: 'b', c: 'c' };

arrOfObj.map(item => item.newKey = Object.assign({}, obj));
console.log(arrOfObj);

// After some modification.
arrOfObj[0].newKey.a = "XXX"
console.log(arrOfObj);

答案 3 :(得分:0)

您必须克隆该项目,将同一对象添加到多个属性中。

请参阅下面的内容。

<body <?php body_class(); ?>>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-P538SGM" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->