Adicionar propriedade a uma série de objetos

110

Eu tenho uma série de objetos, conforme mostrado abaixo

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

Quero adicionar mais uma propriedade chamada Active para cada elemento dessa matriz de objetos.

O resultado final deve ser o seguinte.

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"

Alguém pode me dizer como conseguir isso.

Patrick
fonte
6
Faça um loop pela matriz. Adicione propriedades a cada elemento da matriz durante o loop. Qual parte você não sabe fazer?
JJJ de

Respostas:

157

Você pode usar o forEachmétodo para executar uma função fornecida uma vez para cada elemento da matriz. Nesta função fornecida, você pode adicionar a Activepropriedade ao elemento.

Results.forEach(function (element) {
  element.Active = "false";
});
Tholle
fonte
223

ou usar map

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

Editado para refletir o comentário de @adrianolsk para não alterar o original e, em vez disso, retornar um novo objeto para cada um.

Leia as especificações

Sidonaldson
fonte
4
suportado apenas em ES6
Amaynut
5
ES5 para ser mais preciso;) - mas babel ficará feliz em descompilar
Sidonaldson
51
o mapa deve retornar uma nova matriz sem alterar o objeto, neste caso, forEach seria melhor, ou usar o mapa e retornar um novo objetoResults.map(obj=> ({ ...obj, Active : 'false' }))
adrianolsk
4
Ótima solução, @adrianolsk, você deve enviar isso como uma resposta separada.
Michael Hays
2
  Object.defineProperty(Results, "Active", {value : 'true',
                       writable : true,
                       enumerable : true,
                       configurable : true});
Ivan De Jesus Quezada Segura
fonte
Definindo uma propriedade dinâmica usando Object.defineProperty.
Ivan De Jesus Quezada Segura
1

Também me deparei com esse problema e, ao tentar resolvê-lo, continuei travando a guia do Chrome que estava executando meu aplicativo. Parece que o operador de propagação de objetos foi o culpado.

Com uma pequena ajuda do comentário de adrianolsk e da resposta de Sidonaldson acima, usei Object.assign () a saída do operador de propagação de babel, assim:

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);
});
Joel Balmer
fonte
0

Ele passa pelo objeto como uma estrutura de valor-chave. Em seguida, ele adicionará uma nova propriedade chamada 'Active' e um valor de amostra para esta propriedade ('Active) para cada objeto dentro deste objeto. este código pode ser aplicado para array de objetos e objeto de objetos.

   Object.keys(Results).forEach(function (key){
            Object.defineProperty(Results[key], "Active", { value: "the appropriate value"});
        });
Arash MAS
fonte
Sim, claro, ele passa pelo objeto como uma estrutura de valor-chave. Em seguida, ele adicionará uma nova propriedade chamada 'Active' e um valor de amostra para cada objeto dentro deste objeto. este código pode ser aplicado para array de objetos e objeto de objetos.
Arash MAS de
0

Com ES6 você pode simplesmente fazer:

 for(const element of Results) {
      element.Active = "false";
 }
Salim Lyoussi
fonte