Добавить свойство в массив объектов

100

У меня есть массив объектов, как показано ниже

Object {Results:Array[2]}
     Results:Array[2]
[0-1]
0:Object
       id=1     
       name: "Rick"
1:Object
       id=2     
       name:'david'

Я хочу добавить еще одно свойство с именем Active к каждому элементу этого массива объектов.

Окончательный результат должен быть следующим.

Object {Results:Array[2]}
     Results:Array[2]
[0-1]
0:Object
       id=1     
       name: "Rick"
       Active: "false"
1:Object
       id=2     
       name:'david'
       Active: "false"

Может кто-нибудь, дайте мне знать, как этого добиться.

Патрик
источник
6
Прокрутите массив. Добавляйте свойства к каждому элементу массива во время цикла. Какую часть вы не умеете делать?
JJJ

Ответы:

147

Вы можете использовать этот forEachметод для однократного выполнения предоставленной функции для каждого элемента в массиве. В этой предоставленной функции вы можете добавить Activeсвойство к элементу.

Results.forEach(function (element) {
  element.Active = "false";
});
Толле
источник
201

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

Results.map(obj=> ({ ...obj, Active: 'false' }))

Отредактировано, чтобы отразить комментарий @adrianolsk, чтобы не изменять оригинал и вместо этого возвращать новый объект для каждого.

Прочтите спецификацию

Сидональдсон
источник
4
поддерживается только в ES6
Amaynut
5
ES5, если быть точным;) - но babel с радостью декомпилирует его
sidonaldson
50
map должна возвращать новый массив, а не изменять объект, в этом случае было бы лучше forEach, или использовать map и возвращать новый объектResults.map(obj=> ({ ...obj, Active : 'false' }))
Адрианольск
4
Отличное решение @adrianolsk, вы должны представить это как отдельный ответ.
Майкл Хейс,
2
  Object.defineProperty(Results, "Active", {value : 'true',
                       writable : true,
                       enumerable : true,
                       configurable : true});
Иван Де Хесус Кесада Сегура
источник
Определение динамического свойства с помощью Object.defineProperty.
Иван Де Хесус Кесада Сегура
1

Я тоже столкнулся с этой проблемой, и, пытаясь ее решить, я постоянно ломал вкладку Chrome, на которой выполнялось мое приложение. Похоже, виноват оператор распространения для объектов .

С небольшой помощью из комментария Адрианольска и ответа Сидональдсона выше я использовал Object.assign () вывод оператора распространения из babel, например:

this.options.map(option => {
  // New properties to be added
  const newPropsObj = {
    newkey1:value1,
    newkey2:value2
  };

  // Assign new properties and return
  return Object.assign(option, newPropsObj);
});
Джоэл Балмер
источник
0

Он проходит через объект как структуру «ключ-значение». Затем он добавит новое свойство с именем «Активный» и примерное значение этого свойства («Активный») для каждого отдельного объекта внутри этого объекта. этот код можно применять как для массива объектов, так и для объекта объектов.

   Object.keys(Results).forEach(function (key){
            Object.defineProperty(Results[key], "Active", { value: "the appropriate value"});
        });
Араш МАС
источник
Да, конечно, он проходит через объект как структуру "ключ-значение". Затем он добавит новое свойство с именем «Active» и примерное значение для каждого отдельного объекта внутри этого объекта. этот код можно применять как для массива объектов, так и для объекта объектов.
Arash MAS
0

С ES6 вы можете просто:

 for(const element of Results) {
      element.Active = "false";
 }
Салим Люсси
источник