2009-03-05 6 views
110

J'ai un objet qui contient des alertes et des informations sur les:à un objet Adjonction

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

En plus de cela, j'ai une variable qui dit combien il y a des alertes, alertNo. Ma question est, quand je vais ajouter une nouvelle alerte, est-il possible d'ajouter l'alerte sur l'objet alerts?

+5

Je pense que vous avez un problème avec votre affiché le JSON: 1: {app: 'helloworld', 'message'} = > 1: {app: 'helloworld', message: 'un message'}? –

Répondre

189

Que diriez-vous de stocker les alertes comme des enregistrements dans un tableau au lieu des propriétés d'un seul objet?

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

Et puis d'ajouter un, il suffit d'utiliser push:

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

Avez-vous la possibilité de changer la structure la plus externe à un tableau? Donc, il ressemblerait à ceci

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

Alors, quand vous avez besoin d'en ajouter un, il vous suffit de le pousser sur le tableau

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

Ensuite, vous avez intégré dans l'indice de base zéro pour la façon dont la les erreurs sont énumérées.

3

Vous devriez vraiment aller avec le tableau de suggestions d'alertes, mais autrement ajouter à l'objet que vous avez mentionné ressemblerait à ceci:

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

Mais puisque vous ne devriez pas utiliser les numéros littérales que les noms citent tout et aller avec

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

ou vous pouvez en faire un tableau d'objets.

Accès il ressemble à

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

Essayez ceci:

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

fonctionne assez bien, il va ajouter au début du tableau.

+0

Cela n'a pas fonctionné car je ne peux pas appeler épissure sur un objet, uniquement sur un tableau. –

53

jQuery $.extend(obj1, obj2) fusionnerait 2 objets pour vous, mais vous devriez vraiment utiliser un tableau.

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

L'extension de JQuery est lente: http://trevmex.com/post/2531629773/jquerys-extend-is-slow.En outre, il y a une faute de frappe. $ .extends() devrait lire $ .extend(). – ken

+0

Bonne prise avec la faute de frappe. Il y a des situations où $ .extends est utile mais vous avez raison de le faire quand c'est possible. – respectTheCode

+1

Je pense que extend() est ok quand vous avez seulement une structure d'enregistrement, sans les parenthèses, pour le reste je suis d'accord avec respectTheCode, il suffit d'utiliser push() – elvenbyte

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

Cela ne serait faisable que si les alertes étaient un tableau, pas un objet. – tfantina

0

Comme d'autres réponses ont indiqué, vous trouverez peut-être plus facile de travailler avec un tableau.

Dans le cas contraire:

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

essayer:

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

Questions connexes