2009-03-05 21 views
110

Tengo un objeto que mantiene alerta y algo de información acerca de ellos:Al añadir a un objeto

var alerts = { 
    1: {app:'helloworld','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 objeto alerts?

+5

yo creo que hay un problema con el JSON de publicación: 1: {app: 'holamundo', 'mensaje'} = > 1: {app: 'helloworld', mensaje: 'un mensaje'}? –

Respuesta

189

¿Qué le parece guardar 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 añadir uno, sólo tiene que utilizar push:

alerts.push({num : 3, app:'helloagain_again',message:'yet another message'}); 
2

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

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

Así que cuando se tenía que añadir una, que sólo puede empujar sobre la matriz

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

Entonces usted tiene incorporado un índice basado en cero para la forma en que el los errores están enumerados

3

realmente debería ir con el abanico de alertas sugerencias, pero por lo demás la adición al objeto que usted ha mencionado sería el siguiente:

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

Pero ya que no se debe utilizar números literales como nombres citan todo e ir con

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

o puede hacer que sea una matriz de objetos.

Acceso se ve como

alerts['1'].app 
=> "helloworld" 
-1

Prueba esto:

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

funciona bastante bien, se añadirán al inicio de la matriz.

+0

Esto no funcionó porque no puedo llamar empalme a un objeto, solo en una matriz. –

53

jQuery $.extend(obj1, obj2) fusionaría 2 objetos para usted, pero realmente debería usar 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); 
+0

La extensión de JQuery es lenta: http://trevmex.com/post/2531629773/jquerys-extend-is-slow.Además, hay un error tipográfico. $ .extends() debería leer $ .extend(). – ken

+0

Buena captura con el error tipográfico. Hay situaciones en las que $ .extends es útil pero tiene razón en que debería evitarse cuando sea posible. – respectTheCode

+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

-2
alerts.unshift({"app":"goodbyeworld","message":"cya"}); 
+0

Esto solo sería factible si las alertas fueran una matriz, no un objeto. – tfantina

0

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

No Si:

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"} 
}  

probarlo:

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