Добавить пару ключевых значений ко всем объектам в массиве

Я хотел добавить параметр key: value ко всем объектам в массиве.

например:

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

Теперь я хотел добавить новый параметр, isActive ко всем объектам, так что получившийся массив будет выглядеть.

например:

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

Я всегда могу прокрутить массив и вставить пару ключ, значение. Но было интересно, есть ли лучший способ сделать это.

Ответ 1

Вы можете сделать это с помощью map()

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

var result = arrOfObj.map(function(o) {
  o.isActive = true;
  return o;
})

console.log(result)

Ответ 2

Функция map() является лучшим выбором для этого случая:

[
  {name: 'eve'},
  {name: 'john'},
  {name: 'jane'}
].map(v => ({...v, isActive: true}))

Функция map() function не изменяет исходный массив, а создает новый.

Также вместо .map(v => ({...v, isActive: true})) вы можете использовать альтернативный синтаксис .map(v => Object.assign({}, {isActive: true})) (почти такой же , проверьте разницу)

П.С. Я бы порекомендовал вам изучить следующие методы: map(), filter() и redu().

Ответ 3

Я был бы немного осторожен с некоторыми ответами, представленными здесь, следующие примеры выводят по-разному в соответствии с подходом:

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

Я использовал узел v8.10.0 для тестирования приведенных выше фрагментов кода.

Ответ 4

Решение @Redu - хорошее решение

arrOfObj.map(o = > o.isActive = true;) но Array.map по-прежнему считается циклом всех элементов.

если вы абсолютно не хотите, чтобы какой-либо цикл был здесь грязным взломом:

Object.defineProperty(Object.prototype, "isActive",{
  value: true,
  writable: true,
  configurable: true,
  enumerable: true
});

Мой совет - не использовать его осторожно, хотя, он будет исправлять абсолютно все объекты javascript (Date, Array, Number, String или любые другие, которые наследуют Object), что является действительно плохой практикой...

Ответ 5

Просто вы можете добавить этот путь. см. ниже изображение консоли

enter image description here

Ответ 6

Цитирование через массив и вставка пары ключ, значение - это ваше лучшее решение. Вы можете использовать функцию "map", но это просто вопрос предпочтения.

var arrOfObj = [{name: 'eve'},{name:'john'},{name:'jane'}];
arrOfObj.map(function (obj) { 
   obj.isActive = true;
});

Ответ 7

Просто используйте map:

var arrOfObj = arrOfObj.map(function(element){
   element.active = true;
   return element;
}

Карта довольно приличная в отношении совместимости: вы можете быть достаточно безопасным от IE <= 9.

Однако, если вы на 100% уверены, что ваши пользователи будут использовать браузер, совместимый с ES6, вы можете сократить эту функцию с помощью функций стрелок, так как @Sergey - предположил Панфилов.

Ответ 8

Вы также можете попробовать следующее:

arrOfObj.forEach(function(item){item.isActive = true;});

console.log(arrOfObj);

Ответ 9

    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

arrOfObj.map(o => { 
  o.isActive = true; 
  return o; 
});