Ajout à un objet


156

J'ai un objet qui contient des alertes et des informations à leur sujet:

var alerts = { 
    1: { app: 'helloworld', message: '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, lorsque je vais ajouter une nouvelle alerte, existe-t-il un moyen d'ajouter l'alerte sur l' alertsobjet?


6
Je pense que vous avez un problème avec votre json posté: 1: {app: 'helloworld', 'message'} => 1: {app: 'helloworld', message: 'a message'}?
Andreas Grech

Réponses:


235

Que diriez-vous de stocker les alertes sous forme d'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 pour en ajouter un, il suffit d'utiliser push:

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

1
Cette réponse attend de vous que vous connaissiez l'identifiant de l'alerte à ajouter. Eh bien, si vous savez déjà que, alors vous pouvez simplement suivre l'original format d'objet et faire: alerts[3] = { app: 'hello3', message: 'message 3' }. Avec cela , vous pouvez accéder à un message par id: alerts[2] => { app: 'helloworld', message: 'message' }. Obtenir la longueur est alors juste: Object.keys(alerts).length(ce peu est plus facile avec les tableaux)
Matt

61

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);

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

Bonne prise avec la faute de frappe. Il y a des situations où $ .extends est utile mais vous avez raison de dire qu'il devrait être évité lorsque cela est possible.
respectTheCode

1
Je pense que extend () est correct quand vous n'avez qu'une seule structure d'enregistrement, sans les crochets, pour le reste je suis d'accord avec respectTheCode, utilisez simplement push ()
elvenbyte

39

Vous pouvez le faire avec Object.assign () . Parfois, vous avez besoin d'un tableau, mais lorsque vous travaillez avec des fonctions qui attendent un seul objet JSON - tel qu'un appel OData - j'ai trouvé cette méthode plus simple que de créer un tableau uniquement pour le décompresser.

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

EDIT: Pour répondre au commentaire concernant l'obtention de la clé suivante, vous pouvez obtenir un tableau des clés avec la fonction Object.keys () - voir la réponse de Vadi pour un exemple d'incrémentation de la clé. De même, vous pouvez obtenir toutes les valeurs avec Object.values ​​() et les paires clé-valeur avec Object.entries () .

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}
console.log(Object.keys(alerts))
// Output
Array [ "1", "2" ]

7
C'est en fait la bonne réponse car les autres font référence à la transformation d'un objet en tableau, mais de cette façon, vous le gardez comme objet. Dans le cas de l'auteur, il est possible qu'il fût mieux pour lui de travailler avec les tableaux, mais ce serait la réponse sur la façon d'ajouter à un objet.
Goran Jakovljevic

2
ouais je suis d'accord .. En question il n'y a pas un tableau d'objets c'est juste un objet donc c'est la réponse parfaite!
Kishan Oza

C'est la bonne réponse cependant; comment pouvez-vous savoir quel index vous allez ajouter un nouvel objet?
Capan

1
c'est la réponse à la question du titre.
FistOfFury

11

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

Si non:

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

essayez-le:

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


Cela ne fonctionnera pas si vous avez supprimé des alertes ou ignoré une clé. Vous devriez ajouter quelque chose du genre while(alerts[size]) size++;Et probablement renommer sizeen newId.
Jusqu'au

11

Vous pouvez utiliser la syntaxe de diffusion comme suit.

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

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

7

Maintenant, avec ES6, nous avons un opérateur de propagation très puissant (... Object) qui peut rendre ce travail très facile. Cela peut être fait comme suit:

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
 }

C'est tout. Il ajoutera la clé que vous voulez. J'espère que cela t'aides!!


6

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

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

Mais comme vous ne devriez pas utiliser de nombres littéraux car les noms citent tout et aller avec

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

ou vous pouvez en faire un tableau d'objets.

Y accéder ressemble à

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

5

Avez-vous la possibilité de changer la structure la plus externe en un tableau? Donc ça ressemblerait à ça

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

Ainsi, lorsque vous avez besoin d'en ajouter un, vous pouvez simplement le pousser sur la baie

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

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


2

Beaucoup plus facile avec 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}
}

0

Comme alternative, dans ES6, la syntaxe de diffusion peut être utilisée. ${Object.keys(alerts).length + 1}retourne le suivant idpour l'alerte.

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);


0

Je suis désolé mais je ne peux pas commenter vos réponses déjà à cause de ma réputation! ... donc, si vous voulez modifier la structure de votre objet, vous devez faire comme le dit Thane Plummer, mais un petit truc si vous ne vous souciez pas de l'endroit pour mettre l'élément: il sera inséré en première position si vous ne spécifiez pas le numéro de l'insertion.

C'est merveilleux si vous voulez passer un objet Json par exemple à un appel de fonction mongoDB et insérer une nouvelle clé dans les conditions que vous recevez. Dans ce cas, je vais insérer un élément myUid avec des informations d'une variable à l'intérieur de mon code:

// 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();
}


0

[Javascript] Après un peu de pokery jiggery, cela a fonctionné pour moi:

 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);

Le problème que je devais résoudre était que je pourrais avoir n'importe quel nombre d'événements et ils auraient tous le même nom: LastPostedDateTime, tout ce qui est différent est la date et l'heure.


-1

Essaye ça:

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

Fonctionne plutôt bien, cela l'ajoutera au début du tableau.


Cela n'a pas fonctionné car je ne peux pas appeler splice sur un objet, uniquement sur un tableau.
Richard Woolf
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.