An ein Objekt anhängen

156

Ich habe ein Objekt, das Warnungen und einige Informationen darüber enthält:

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

Darüber hinaus habe ich eine Variable, die angibt, wie viele Warnungen es gibt alertNo. Meine Frage ist, ob ich beim Hinzufügen einer neuen Warnung eine Möglichkeit habe, die Warnung an das alertsObjekt anzuhängen .

Steve Gattuso
quelle
6
Ich denke, Sie haben ein Problem mit Ihrem geposteten json: 1: {app: 'helloworld', 'message'} => 1: {app: 'helloworld', message: 'a message'}?
Andreas Grech

Antworten:

235

Wie wäre es, wenn Sie die Warnungen als Datensätze in einem Array anstelle der Eigenschaften eines einzelnen Objekts speichern?

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

Und um dann eine hinzuzufügen, verwenden Sie einfach push:

alerts.push({num : 3, app:'helloagain_again',message:'yet another message'});
Andreas Grech
quelle
1
Diese Antwort erwartet, dass Sie die ID der hinzuzufügenden Warnung kennen. Wenn Sie das bereits wissen, können Sie einfach dem ursprünglichen Objektformat folgen und Folgendes tun : alerts[3] = { app: 'hello3', message: 'message 3' }. Damit können Sie über die ID auf eine Nachricht zugreifen : alerts[2] => { app: 'helloworld', message: 'message' }. Die Länge zu bekommen ist dann nur: Object.keys(alerts).length(das Bit ist einfacher mit Arrays)
Matt
61

jQuery $.extend(obj1, obj2)würde 2 Objekte für Sie zusammenführen, aber Sie sollten wirklich ein Array verwenden.

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);
respektiere den Code
quelle
Die Erweiterung von JQuery ist langsam: trevmex.com/post/2531629773/jquerys-extend-is-slow . Es gibt auch einen Tippfehler. $ .extends () sollte $ .extend () lesen.
Ken
Guter Fang mit dem Tippfehler. Es gibt Situationen, in denen $ .extends hilfreich ist, aber Sie haben Recht, dass dies nach Möglichkeit vermieden werden sollte.
Respektieren Sie den Code
1
Ich denke, verlängern () ist in Ordnung, wenn Sie nur eine Datensatzstruktur haben, ohne die Klammern, für den Rest stimme ich mit RespektTheCode überein, verwenden Sie einfach push ()
elvenbyte
39

Sie können dies mit Object.assign () tun . Manchmal benötigen Sie ein Array, aber wenn Sie mit Funktionen arbeiten, die ein einzelnes JSON-Objekt erwarten, z. B. einen OData-Aufruf, ist diese Methode einfacher als das Erstellen eines Arrays nur zum Entpacken.

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

BEARBEITEN: Um den Kommentar zum Abrufen des nächsten Schlüssels zu beantworten , können Sie mit der Funktion Object.keys () ein Array der Schlüssel abrufen. Ein Beispiel für das Inkrementieren des Schlüssels finden Sie in der Antwort von Vadi. Ebenso können Sie alle Werte mit Object.values ​​() und Schlüssel-Wert-Paare mit Object.entries () abrufen .

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}
console.log(Object.keys(alerts))
// Output
Array [ "1", "2" ]
Thane Plummer
quelle
7
Dies ist eigentlich die richtige Antwort, da sich die anderen auf die Umwandlung von Objekten in das Array beziehen, aber auf diese Weise behalten Sie es als Objekt bei. Im Fall des Autors ist es möglich, dass es für ihn besser ist, mit den Arrays zu arbeiten, aber dies wäre die Antwort darauf, wie man ein Objekt anfügt.
Goran Jakovljevic
2
Ja, ich stimme zu. In Frage, es gibt kein Array von Objekten, es ist nur ein Objekt, also ist dies die perfekte Antwort!
Kishan Oza
Dies ist jedoch die richtige Antwort; Wie können Sie wissen, welchen Index Sie ein neues Objekt hinzufügen werden?
Capan
1
Dies ist die Antwort auf die Titelfrage.
FistOfFury
11

Wie in anderen Antworten erwähnt, fällt es Ihnen möglicherweise leichter, mit einem Array zu arbeiten.

Wenn nicht:

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

Versuch es:

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

MC
quelle
Dies funktioniert nicht, wenn Sie Warnungen gelöscht oder einen Schlüssel übersprungen haben. Sie sollten etwas in der Art von hinzufügen while(alerts[size]) size++;und wahrscheinlich umbenennen sizein newId.
Bis zum
11

Sie können die Spread-Syntax wie folgt verwenden.

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

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

Jetzt haben wir mit ES6 einen sehr leistungsfähigen Spread-Operator (... Object), der diese Arbeit sehr einfach machen kann. Dies kann wie folgt erfolgen:

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
 }

Das ist es. Es wird der gewünschte Schlüssel hinzugefügt. Hoffe das hilft!!

Harshit Agarwal
quelle
6

Sie sollten sich wirklich an die Reihe der Warnungsvorschläge halten, aber ansonsten würde das Hinzufügen zu dem von Ihnen erwähnten Objekt folgendermaßen aussehen:

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

Aber da sollten Sie keine wörtlichen Zahlen verwenden, da Namen alles zitieren und mitgehen

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

oder Sie können daraus ein Array von Objekten machen.

Der Zugriff darauf sieht so aus

alerts['1'].app
=> "helloworld"
Dlamblin
quelle
5

Haben Sie die Möglichkeit, die äußerste Struktur in ein Array zu ändern? So würde es aussehen

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

Wenn Sie also eines hinzufügen müssen, können Sie es einfach auf das Array übertragen

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

Dann haben Sie einen eingebauten nullbasierten Index für die Aufzählung der Fehler.

Peter Bailey
quelle
2

Viel einfacher mit 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
quelle
0

Alternativ kann in ES6 die Spread-Syntax verwendet werden. ${Object.keys(alerts).length + 1}kehrt als nächstes idzur Warnung zurück.

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

Es tut mir leid, aber ich kann Ihre Antworten aufgrund meines Rufs nicht kommentieren! ... Wenn Sie also die Struktur Ihres Objekts ändern möchten, müssen Sie das tun , was Thane Plummer sagt, aber einen kleinen Trick, wenn es Ihnen egal ist, wo Um das Element zu platzieren: Es wird an der ersten Position eingefügt, wenn Sie die Nummer für das Einfügen nicht angeben.

Dies ist wunderbar, wenn Sie beispielsweise ein Json-Objekt an einen mongoDB-Funktionsaufruf übergeben und einen neuen Schlüssel in die Bedingungen einfügen möchten, die Sie erhalten. In diesem Fall füge ich ein Element myUid mit einigen Informationen aus einer Variablen in meinen Code ein:

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

Marc
quelle
0

[Javascript] Nach ein bisschen Jiggery Pokery hat das bei mir funktioniert:

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

Das Problem, das ich lösen musste, war, dass ich möglicherweise eine beliebige Anzahl von Ereignissen hatte und alle denselben Namen hatten: LastPostedDateTime Alles, was sich unterscheidet, ist das Datum und die Uhrzeit.

David White
quelle
-1

Versuche dies:

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

Funktioniert ziemlich gut, es wird am Anfang des Arrays hinzugefügt.

HM2K
quelle
Dies hat nicht funktioniert, da ich Splice nicht für ein Objekt aufrufen kann, sondern nur für ein Array.
Richard Woolf