Agregar propiedad a una matriz de objetos

100

Tengo una matriz de objetos como se muestra a continuación

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

Quiero agregar una propiedad más llamada Activa a cada elemento de esta matriz de Objetos.

El resultado final debería ser el siguiente.

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"

¿Alguien puede decirme cómo lograr esto?

Patricio
fuente
6
Recorre la matriz. Agregue propiedades a cada elemento de la matriz mientras realiza un bucle. ¿Qué parte no sabes hacer?
JJJ

Respuestas:

147

Puede utilizar el forEachmétodo para ejecutar una función proporcionada una vez para cada elemento de la matriz. En esta función provista, puede agregar la Activepropiedad al elemento.

Results.forEach(function (element) {
  element.Active = "false";
});
Tholle
fuente
201

o usar map

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

Editado para reflejar el comentario de @adrianolsk para no mutar el original y, en cambio, devolver un nuevo objeto para cada uno.

Leer la especificación

sidonaldson
fuente
4
solo se admite en ES6
Amaynut
5
ES5 para ser precisos;) - pero babel felizmente lo descompilará
sidonaldson
50
map debe devolver una nueva matriz, no mutar el objeto, en este caso forEach sería mejor, o usar map y devolver un nuevo objetoResults.map(obj=> ({ ...obj, Active : 'false' }))
adrianolsk
4
Gran solución @adrianolsk, debe enviarla como una respuesta separada.
Michael Hays
2
  Object.defineProperty(Results, "Active", {value : 'true',
                       writable : true,
                       enumerable : true,
                       configurable : true});
Iván De Jesús Quezada Segura
fuente
Definición de una propiedad dinámica mediante Object.defineProperty.
Ivan De Jesus Quezada Segura
1

También me encontré con este problema, y ​​al tratar de resolverlo seguí bloqueando la pestaña de Chrome que estaba ejecutando mi aplicación. Parece que el culpable fue el operador de propagación de objetos .

Con un poco de ayuda del comentario de adrianolsk y la respuesta de sidonaldson anterior, usé Object.assign () la salida del operador de propagación de babel, así:

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
fuente
0

Pasa por el objeto como una estructura de clave-valor. Luego agregará una nueva propiedad llamada 'Activo' y un valor de muestra para esta propiedad ('Activo) a cada objeto dentro de este objeto. este código se puede aplicar tanto para una matriz de objetos como para un objeto de objetos.

   Object.keys(Results).forEach(function (key){
            Object.defineProperty(Results[key], "Active", { value: "the appropriate value"});
        });
Arash MAS
fuente
Sí, claro, pasa por el objeto como una estructura de clave-valor. Luego agregará una nueva propiedad llamada 'Activo' y un valor de muestra a cada objeto dentro de este objeto. este código se puede aplicar tanto para una matriz de objetos como para un objeto de objetos.
Arash MAS
0

Con ES6 simplemente puede hacer:

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