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

时间:2016-10-03 08:10:10

标签: javascript arrays

我想为数组中的所有对象添加一个键:value参数。

例如:

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

现在我想为所有对象添加一个新参数isActive,以便生成的数组看起来像。

例如:

    [{
    name: 'eve',
    isActive: true
}, {
    name: 'john',
    isActive: true
}, {
    name: 'jane',
    isActive: true
}]

我总是可以遍历数组并插入一个键值对。但是想知道是否有更好的方法这样做

11 个答案:

答案 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除外)。

另外,我建议您确保了解以下方法:.map().filter().reduce()。这是一个很好的开始

答案 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)

只需添加即可。参见下面的控制台图片

enter image description here

答案 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; 
});
相关问题