我想为数组中的所有对象添加一个键:value参数。
例如:
var arrOfObj = [{name: 'eve'},{name:'john'},{name:'jane'}];
现在我想为所有对象添加一个新参数isActive,以便生成的数组看起来像。
例如:
[{
name: 'eve',
isActive: true
}, {
name: 'john',
isActive: true
}, {
name: 'jane',
isActive: true
}]
我总是可以遍历数组并插入一个键值对。但是想知道是否有更好的方法这样做
答案 0 :(得分:39)
您可以使用map()
var arrOfObj = [{
name: 'eve'
}, {
name: 'john'
}, {
name: 'jane'
}];
var result = arrOfObj.map(function(o) {
o.isActive = true;
return o;
})
console.log(result)

如果要保留原始数组,可以使用Object.assign()
var arrOfObj = [{
name: 'eve'
}, {
name: 'john'
}, {
name: 'jane'
}];
var result = arrOfObj.map(function(el) {
var o = Object.assign({}, el);
o.isActive = true;
return o;
})
console.log(arrOfObj);
console.log(result);

答案 1 :(得分:12)
不确定。看看ES5's array methods
对于这种情况,您曾使用.map():
arrOfObj.map(function (v) {
v.isActive = true
})
或在ES6中
arrOfObj.map(v => v.isActive = true)
Atm这些方法具有良好的浏览器支持(guess who除外)。
答案 2 :(得分:12)
我对这里提到的一些答案会有点谨慎,以下示例根据方法输出不同:
const list = [ { a : 'a', b : 'b' } , { a : 'a2' , b : 'b2' }]
console.log(list.map(item => item.c = 'c'))
// [ 'c', 'c' ]
console.log(list.map(item => {item.c = 'c'; return item;}))
// [ { a: 'a', b: 'b', c: 'c' }, { a: 'a2', b: 'b2', c: 'c' } ]
console.log(list.map(item => Object.assign({}, item, { c : 'c'})))
// [ { a: 'a', b: 'b', c: 'c' }, { a: 'a2', b: 'b2', c: 'c' } ]
我使用 node v8.10.0 来测试上面的代码。
答案 3 :(得分:2)
@Redé的解决方案是一个很好的解决方案
arrOfObj.map(o => o.isActive = true;) 但是Array.map仍然算作循环遍历所有项目。
如果你绝对不想在这里进行任何循环,那就是一个肮脏的黑客:
Object.defineProperty(Object.prototype, "isActive",{
value: true,
writable: true,
configurable: true,
enumerable: true
});
我的建议是不要小心使用它, 它将绝对修补所有javascript对象(日期,数组,数字,字符串或任何其他继承对象),这是非常糟糕的做法......
答案 4 :(得分:1)
答案 5 :(得分:1)
package.json
答案 6 :(得分:0)
循环遍历数组并插入密钥,值对是您的最佳解决方案。您可以使用“地图”功能,但这只是一个偏好问题。
var arrOfObj = [{name: 'eve'},{name:'john'},{name:'jane'}];
arrOfObj.map(function (obj) {
obj.isActive = true;
});
答案 7 :(得分:0)
只需使用map功能:
var arrOfObj = arrOfObj.map(function(element){
element.active = true;
return element;
}
Map在兼容性方面非常不错:从IE< = 9开始,你可以相当安全。
但是,如果您100%确定您的用户将使用ES6兼容浏览器,则可以使用arrow functions来缩短该功能,正如@Sergey Panfilov建议的那样。
答案 8 :(得分:0)
你也可以试试这个:
arrOfObj.forEach(function(item){item.isActive = true;});
console.log(arrOfObj);
答案 9 :(得分:0)
var arrOfObj = [{name: 'eve'},{name:'john'},{name:'jane'}];
var injectObj = {isActive:true, timestamp:new Date()};
// function to inject key values in all object of json array
function injectKeyValueInArray (array, keyValues){
return new Promise((resolve, reject) => {
if (!array.length)
return resolve(array);
array.forEach((object) => {
for (let key in keyValues) {
object[key] = keyValues[key]
}
});
resolve(array);
})
};
//call function to inject json key value in all array object
injectKeyValueInArray(arrOfObj,injectObj).then((newArrOfObj)=>{
console.log(newArrOfObj);
});
输出如下: -
[ { name: 'eve',
isActive: true,
timestamp: 2017-12-16T16:03:53.083Z },
{ name: 'john',
isActive: true,
timestamp: 2017-12-16T16:03:53.083Z },
{ name: 'jane',
isActive: true,
timestamp: 2017-12-16T16:03:53.083Z } ]
答案 10 :(得分:0)
arrOfObj.map(o => {
o.isActive = true;
return o;
});