Verketten Sie zwei JSON-Objekte

73

Ich habe zwei JSON-Objekte mit derselben Struktur und möchte sie mit Javascript zusammenfassen. Gibt es eine einfache Möglichkeit, dies zu tun?

Craig
quelle
Wie genau möchten Sie sie konzentrieren? Jedes Element beider Objekte oder beide Objekte als neues Objekt mit den Ursprungsobjekten als Elemente oder…?
Gumbo
1
Grundsätzlich habe ich ein Array von 10 Json-Objekten. Ich rufe dann Ajax auf, um weitere 10 Json-Objekte zu erhalten, und möchte sie zusammenfassen, um ein Array von 20 Objekten zu erstellen.
Craig
Haben Sie JSON- Objekte (in eine Variable vom Typ Object deserialisiert) oder Zeichenfolgen (serialisierte Form)?
Ates Goral

Antworten:

96

Basierend auf Ihrer Beschreibung in den Kommentaren würden Sie einfach ein Array-Concat erstellen:

var jsonArray1 = [{'name': "doug", 'id':5}, {'name': "dofug", 'id':23}];
var jsonArray2 = [{'name': "goud", 'id':1}, {'name': "doaaug", 'id':52}];
jsonArray1 = jsonArray1.concat(jsonArray2);
// jsonArray1 = [{'name': "doug", 'id':5}, {'name': "dofug", 'id':23}, 
//{'name': "goud", 'id':1}, {'name': "doaaug", 'id':52}];
Jacobangel
quelle
5
Ihre Annahme über den Wert von jsonArray1 ist falsch. concat ändert das ursprüngliche Array nicht, sondern gibt ein neues Array zurück.
Bretonischer
1
Sie müssten jsonArray1 = jsonArray1.concat (jsonArray2) ausführen;
Bretonischer
Das hat mich wirklich gerettet. Danke @jacobangel
mutiemule
1
Für die 1, 2, 3 kann dies für eine saubere Zusammenführung nützlich sein:var arr3 = [].concat(arr1, arr2);
Kevin Leary
38

Wenn Sie die Eigenschaften lieber kopieren möchten:

var json1 = { value1: '1', value2: '2' };
var json2 = { value2: '4', value3: '3' };


function jsonConcat(o1, o2) {
 for (var key in o2) {
  o1[key] = o2[key];
 }
 return o1;
}

var output = {};
output = jsonConcat(output, json1);
output = jsonConcat(output, json2);

Die Ausgabe des obigen Codes ist{ value1: '1', value2: '4', value3: '3' }

user53964
quelle
2
Da es sich um Objekte handelt, müssen Sie sie nicht zurückgeben, da Objekte als Referenz übergeben werden
darkyndy
Hatte einen interessanten Eckfall, in dem ich Eigenschaften von zwei JSON-Objekten zusammenführen musste, funktionierte dies wie ein Zauber. Vielen Dank.
Rodinga
26

Der eigentliche Weg ist die Verwendung von JS Object.assign.

Object.assign(target, ...sources)

MDN Link

Es gibt einen weiteren Operator für die Objektverteilung, der für ES7 vorgeschlagen wird und mit Babel-Plugins verwendet werden kann.

 Obj = {...sourceObj1, ...sourceObj2}
Raunaq Sachdev
quelle
23

Sie können die JQuery- Extend- Methode verwenden.

Beispiel:

o1 = {"foo":"bar", "data":{"id":"1"}};
o2 = {"x":"y"};
sum = $.extend(o1, o2);

Ergebnis:

sum = {"foo":"bar", "data":{"id":"1"}, "x":"y"}
tnimas
quelle
Bessere Lösung
Rijo
Einfachere und sauberere Lösung.
fsinisi90
Ein Fall, in dem jQuery nicht übertrieben ist.
JustCarty
15

Eine Lösung besteht darin, eine Liste / ein Array zu verwenden:

var first_json = {"name":"joe", "age":27};
var second_json = {"name":"james", "age":32};

var jsons = new Array();
jsons.push(first_json);
jsons.push(second_json);

Ergebnis

jsons = [
    {"name":"joe", "age":27},
    {"name":"james", "age":32}
]
Soviut
quelle
1
Husten, was ist mit [first_json, second_json]?
PascalVKooten
1
Das ist sicherlich richtig, wenn das OP nur zwei Objekte hat, aber da sie speziell die Verkettung erwähnten, schien es wahrscheinlicher, dass dies ein erfundenes Beispiel war, das nach einer Möglichkeit zum Anhängen suchte.
Soviut
14

Ich benutze:

let x = { a: 1, b: 2, c: 3 }

let y = {c: 4, d: 5, e: 6 }

let z = Object.assign(x, y)

console.log(z)

// OUTPUTS:
{ a:1, b:2, c:4, d:5, e:6 }

Von hier aus .

Alvaro
quelle
Danke, das war die schnelle Lösung, nach der ich gesucht habe!
Nena
7

Sie können die Object.assign () -Methode verwenden. Die Object.assign () -Methode wird verwendet, um die Werte aller aufzählbaren eigenen Eigenschaften von einem oder mehreren Quellobjekten in ein Zielobjekt zu kopieren. Das Zielobjekt wird zurückgegeben. [1]

var o1 = { a: 1 }, o2 = { b: 2 }, o3 = { c: 3 };

var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
JC Gras
quelle
2
Bester, prägnanter Code mit einem relevanten Beispiel bisher! Es wäre schön, wenn Sie klären würden, was passiert, wenn die Schlüssel für verschiedene Objekte nicht eindeutig sind :)
Akash Agarwal
5

Wenn Sie TypeScript verwenden, können Sie den Spread-Operator ( ...) verwenden.

var json = {...json1,...json2} 

Tushar
quelle
Vielen Dank!, Aus irgendeinem Grund hat dies besser funktioniert, um mit Render-Zuständen zu reagieren
CrsCaballero vor
1

Okay, Sie können dies in einer Codezeile tun. Sie benötigen dafür json2.js (wahrscheinlich haben Sie bereits.). Die beiden JSON-Objekte hier sind nicht analysierte Zeichenfolgen.

json1 = '[{"foo":"bar"},{"bar":"foo"},{"name":"craig"}]';

json2 = '[{"foo":"baz"},{"bar":"fob"},{"name":"george"}]';

concattedjson = JSON.stringify(JSON.parse(json1).concat(JSON.parse(json2)));
Bretonisch
quelle
1

Versuchen Sie dies einfach mit einem Unterstrich

var json1 = [{ value1: '1', value2: '2' },{ value1: '3', value2: '4' }];
var json2 = [{ value3: 'a', value4: 'b' },{ value3: 'c', value4: 'd' }];
var resultArray = [];
json1.forEach(function(obj, index){
  resultArray.push(_.extend(obj,  json2[index]));
});

console.log("Result Array", resultArray);

Ergebnis

Rejayi CS
quelle
0
var baseArrayOfJsonObjects = [{},{}];
for (var i=0; i<arrayOfJsonObjectsFromAjax.length; i++) {
    baseArrayOfJsonObjects.push(arrayOfJsonObjectsFromAjax[i]);
}
Luca Matteis
quelle
0

Ich benutze:

let jsonFile = {};    
let schemaJson = {};    
schemaJson["properties"] = {};    
schemaJson["properties"]["key"] = "value";
jsonFile.concat(schemaJson);
Alvaro
quelle