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?


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}];

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


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}

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

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

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 .


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 }

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} 


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

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


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

0

Ich benutze:

let jsonFile = {};    
let schemaJson = {};    
schemaJson["properties"] = {};    
schemaJson["properties"]["key"] = "value";
jsonFile.concat(schemaJson);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.