Anexar a un objeto

156

Tengo un objeto que contiene alertas y algo de información sobre ellas:

var alerts = { 
    1: { app: 'helloworld', message: 'message' },
    2: { app: 'helloagain', message: 'another message' }
}

Además de esto, tengo una variable que dice cuántas alertas existen, alertNo. Mi pregunta es, cuando voy a agregar una nueva alerta, ¿hay alguna forma de agregar la alerta al alertsobjeto?

Steve Gattuso
fuente
66
Creo que tienes un problema con tu json publicado: 1: {app: 'helloworld', 'message'} => 1: {app: 'helloworld', message: 'a message'}?
Andreas Grech el

Respuestas:

235

¿Qué tal almacenar las alertas como registros en una matriz en lugar de las propiedades de un solo objeto?

var alerts = [ 
    {num : 1, app:'helloworld',message:'message'},
    {num : 2, app:'helloagain',message:'another message'} 
]

Y luego para agregar uno, simplemente use push:

alerts.push({num : 3, app:'helloagain_again',message:'yet another message'});
Andreas Grech
fuente
1
Esta respuesta espera que usted sepa la identificación de la alerta que se agregará. Bueno, si usted ya sabe que, a continuación, sólo tiene que seguir el formato del objeto original y hacer: alerts[3] = { app: 'hello3', message: 'message 3' }. Con esto se puede acceder a un mensaje por id: alerts[2] => { app: 'helloworld', message: 'message' }. Obtener la longitud es simplemente: Object.keys(alerts).length(ese bit es más fácil con las matrices)
Matt
61

jQuery $.extend(obj1, obj2)fusionaría 2 objetos para usted, pero realmente debería estar usando una matriz.

var alertsObj = {
    1: {app:'helloworld','message'},
    2: {app:'helloagain',message:'another message'}
};

var alertArr = [
    {app:'helloworld','message'},
    {app:'helloagain',message:'another message'}
];

var newAlert = {app:'new',message:'message'};

$.extend(alertsObj, newAlert);
alertArr.push(newAlert);
respectTheCode
fuente
La extensión de JQuery es lenta: trevmex.com/post/2531629773/jquerys-extend-is-slow . Además, hay un error tipográfico. $ .extends () debería leer $ .extend ().
Ken
Buena captura con el error tipográfico. Hay situaciones en las que $ .extends es útil, pero tiene razón en que debe evitarse cuando sea posible.
respectTheCode 05 de
1
Creo que extender () está bien cuando solo tienes una estructura de registro, sin los corchetes, por lo demás, estoy de acuerdo con respectTheCode, solo usa push ()
elvenbyte
39

Puede hacer esto con Object.assign () . A veces necesita una matriz, pero cuando trabaja con funciones que esperan un solo objeto JSON, como una llamada OData, he encontrado este método más simple que crear una matriz solo para descomprimirlo.

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}

alerts = Object.assign({3: {app:'helloagain_again',message:'yet another message'}}, alerts)

//Result:
console.log(alerts)
{ 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
    3: {app: "helloagain_again",message: "yet another message"}
} 

EDITAR: para abordar el comentario sobre la obtención de la siguiente clave, puede obtener una matriz de claves con la función Object.keys () ; consulte la respuesta de Vadi para ver un ejemplo de incremento de la clave. Del mismo modo, puede obtener todos los valores con Object.values ​​() y pares clave-valor con Object.entries () .

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}
console.log(Object.keys(alerts))
// Output
Array [ "1", "2" ]
Thane Plummer
fuente
77
Esta es en realidad la respuesta correcta, ya que los demás se refieren a la transformación del objeto en la matriz, pero de esta manera lo mantendrá como el objeto. En el caso del autor, es posible que sea mejor para él trabajar con las matrices, pero esta sería la respuesta sobre cómo agregar a un objeto.
Goran Jakovljevic
2
Sí, estoy de acuerdo. En cuestión no hay una matriz de objetos, es solo un objeto, ¡esta es la respuesta perfecta!
Kishan Oza
Sin embargo, esta es la respuesta adecuada; ¿Cómo puede saber qué índice va a agregar un nuevo objeto?
Capan
1
Esta es la respuesta a la pregunta del título.
FistOfFury
11

Como señalaron otras respuestas, puede que le resulte más fácil trabajar con una matriz.

Si no:

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}

// Get the current size of the object
size = Object.keys(alerts).length

//add a new alert 
alerts[size + 1] = {app:'Your new app', message:'your new message'}

//Result:
console.log(alerts)
{ 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
    3: {app: "Another hello",message: "Another message"}
}      

intentalo:

https://jsbin.com/yogimo/edit?js,console

MC
fuente
Esto no funcionará si eliminó las alertas u omitió una clave. Debería agregar algo en la línea de while(alerts[size]) size++;Y probablemente cambiar el nombre sizea newId.
Hasta el
11

Puede usar la sintaxis de propagación de la siguiente manera ...

var alerts = { 
1: { app: 'helloworld', message: 'message' },
2: { app: 'helloagain', message: 'another message' }
 }

alerts = {...alerts, 3: {app: 'hey there', message: 'another message'} }
inzo
fuente
7

Ahora con ES6 tenemos un operador de propagación muy potente (... Object) que puede hacer este trabajo muy fácil. Se puede hacer de la siguiente manera:

let alerts = { 
   1: { app: 'helloworld', message: 'message' },
   2: { app: 'helloagain', message: 'another message' }
} 

//now suppose you want to add another key called alertNo. with value 2 in the alerts object. 

alerts = {
   ...alerts,
   alertNo: 2
 }

Eso es. Agregará la clave que desee. ¡¡Espero que esto ayude!!

Harshit Agarwal
fuente
6

Realmente debería ir con la variedad de sugerencias de alertas, pero de lo contrario agregar al objeto que mencionó se vería así:

alerts[3]={"app":"goodbyeworld","message":"cya"};

Pero como no debe usar números literales como nombres, cite todo y vaya con

alerts['3']={"app":"goodbyeworld","message":"cya"};

o puede convertirlo en una matriz de objetos.

Accediendo parece

alerts['1'].app
=> "helloworld"
dlamblin
fuente
5

¿Tiene la capacidad de cambiar la estructura más externa a una matriz? Entonces se vería así

var alerts = [{"app":"helloworld","message":null},{"app":"helloagain","message":"another message"}];

Entonces, cuando necesita agregar uno, simplemente puede insertarlo en la matriz

alerts.push( {"app":"goodbyeworld","message":"cya"} );

Luego tiene un índice basado en cero incorporado para la forma en que se enumeran los errores.

Peter Bailey
fuente
2

Mucho más fácil con ES6:

let exampleObj = {
  arg1: {
    subArg1: 1,
    subArg2: 2,
  },
  arg2: {
    subArg1: 1,
    subArg2: 2,
  }
};

exampleObj.arg3 = {
  subArg1: 1,
  subArg2: 2,
};

console.log(exampleObj);

{
arg1: {subArg1: 1, subArg2: 2}
arg2: {subArg1: 1, subArg2: 2}
arg3: {subArg1: 1, subArg2: 2}
}
Maroun Melhem
fuente
0

Como alternativa, en ES6, se podría usar la sintaxis extendida. ${Object.keys(alerts).length + 1}vuelve a continuación idpara alerta.

let alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
};

alerts = {
  ...alerts, 
  [`${Object.keys(alerts).length + 1}`]: 
  { 
    app: `helloagain${Object.keys(alerts).length + 1}`,message: 'next message' 
  } 
};

console.log(alerts);

Vadi
fuente
0

Lo siento, ¡pero no puedo comentar sus respuestas debido a mi reputación! ... así que, si desea modificar la estructura de su objeto, debe hacerlo que dice Thane Plummer, pero un pequeño truco si no te importa dónde para colocar el elemento: se insertará en la primera posición si no especifica el número para la inserción.

Esto es maravilloso si desea pasar un objeto Json, por ejemplo, a una llamada de función mongoDB e insertar una nueva clave dentro de las condiciones que recibe. En este caso, insertaré un elemento myUid con información de una variable dentro de mi código:

// From backend or anywhere
let myUid = { _id: 'userid128344'};
// ..
// ..

  let myrequest = { _id: '5d8c94a9f629620ea54ccaea'};
  const answer = findWithUid( myrequest).exec();

// ..
// ..

function findWithUid( conditions) {
  const cond_uid = Object.assign({uid: myUid}, conditions);
  // the object cond_uid now is:
  // {uid: 'userid128344', _id: '5d8c94a9f629620ea54ccaea'}
  // so you can pass the new object Json completly with the new key
  return myModel.find(cond_uid).exec();
}

Bagazo
fuente
0

[Javascript] Después de un poco de jiggery pokery, esto funcionó para mí:

 let dateEvents = (
            {
                'Count': 2,
                'Items': [
                    {
                        'LastPostedDateTime': {
                            "S": "10/16/2019 11:04:59"
                        }
                    },
                    {
                        'LastPostedDateTime': {
                            "S": "10/30/2019 21:41:39"
                        }
                    }
                ],
            }
        );
        console.log('dateEvents', dateEvents);

El problema que necesitaba resolver era que podría tener cualquier número de eventos y todos tendrían el mismo nombre: LastPostedDateTime todo lo que es diferente es la fecha y la hora.

David White
fuente
-1

Prueba esto:

alerts.splice(0,0,{"app":"goodbyeworld","message":"cya"});

Funciona bastante bien, lo agregará al inicio de la matriz.

HM2K
fuente
Esto no funcionó porque no puedo llamar al empalme en un objeto, solo en una matriz.
Richard Woolf