In Node.js können wir zwei Objekte durch die Erweiterung von underscore oder lodash zusammenführen, aber wie geht man mit komplexen Objekten wie den folgenden um?
Node.js führt zwei komplexe Objekte zusammen
Zum Beispiel gibt es die folgenden zwei Objekte:
var obj1 = { "name" : "myname", "status" : 0, "profile": { "sex":"m", "isactive" : true}, "strarr":["one", "three"], "objarray": [ { "id": 1, "email": "a1@me.com", "isactive":true }, { "id": 2, "email": "a2@me.com", "isactive":false } ] }; var obj2 = { "name" : "myname", "status" : 1, "newfield": 1, "profile": { "isactive" : false, "city": "new York"}, "strarr":["two"], "objarray": [ { "id": 1, "isactive":false }, { "id": 2, "email": "a2modified@me.com" }, { "id": 3, "email": "a3new@me.com", "isactive" : true } ] };
Ich hoffe, dass das zusammengeführte Ergebnis wie folgt ausgegeben wird:
{ name: 'myname', status: 1, profile: { sex: 'm', isactive: false, city: 'new York' }, strarr: [ 'one', 'three', 'two' ], objarray: [ { id: 1, email: 'a1@me.com', isactive: false }, { id: 2, email: 'a2modified@me.com', isactive: false }, { id: 3, email: 'a3new@me.com', isactive: true } ], newfield: 1 }
Wir können das obige Ergebnis mit den vorhandenen Methoden von nicht erreichen Unterstrich oder Lodash, dann können Sie nur selbst Code schreiben, um dies zu erreichen.
function mergeObjs(def, obj) { if (!obj) { return def; } else if (!def) { return obj; } for (var i in obj) { // if its an object if (obj[i] != null && obj[i].constructor == Object) { def[i] = mergeObjs(def[i], obj[i]); } // if its an array, simple values need to be joined. Object values need to be remerged. else if(obj[i] != null && (obj[i] instanceof Array) && obj[i].length > 0) { // test to see if the first element is an object or not so we know the type of array we're dealing with. if(obj[i][0].constructor == Object) { var newobjs = []; // create an index of all the existing object IDs for quick access. There is no way to know how many items will be in the arrays. var objids = {} for(var x= 0, l= def[i].length ; x < l; x++ ) { objids[def[i][x].id] = x; } // now walk through the objects in the new array // if the ID exists, then merge the objects. // if the ID does not exist, push to the end of the def array for(var x= 0, l= obj[i].length; x < l; x++) { var newobj = obj[i][x]; if(objids[newobj.id] !== undefined) { def[i][x] = mergeObjs(def[i][x],newobj); } else { newobjs.push(newobj); } } for(var x= 0, l = newobjs.length; x<l; x++) { def[i].push(newobjs[x]); } } else { for(var x=0; x < obj[i].length; x++) { var idxObj = obj[i][x]; if(def[i].indexOf(idxObj) === -1) { def[i].push(idxObj); } } } } else { def[i] = obj[i]; } } return def;}
Durch eine leichte Verbesserung des obigen Codes können wir während des Zusammenführungsprozesses automatisch Werte vom Typ „Zahl“ hinzufügen.
function merge(def, obj) { if (!obj) { return def; } else if (!def) { return obj; } for (var i in obj) { // if its an object if (obj[i] != null && obj[i].constructor == Object) { def[i] = merge(def[i], obj[i]); } // if its an array, simple values need to be joined. Object values need to be re-merged. else if(obj[i] != null && (obj[i] instanceof Array) && obj[i].length > 0) { // test to see if the first element is an object or not so we know the type of array we're dealing with. if(obj[i][0].constructor == Object) { var newobjs = []; // create an index of all the existing object IDs for quick access. There is no way to know how many items will be in the arrays. var objids = {} for(var x= 0, l= def[i].length ; x < l; x++ ) { objids[def[i][x].id] = x; } // now walk through the objects in the new array // if the ID exists, then merge the objects. // if the ID does not exist, push to the end of the def array for(var x= 0, l= obj[i].length; x < l; x++) { var newobj = obj[i][x]; if(objids[newobj.id] !== undefined) { def[i][x] = merge(def[i][x],newobj); } else { newobjs.push(newobj); } } for(var x= 0, l = newobjs.length; x<l; x++) { def[i].push(newobjs[x]); } } else { for(var x=0; x < obj[i].length; x++) { var idxObj = obj[i][x]; if(def[i].indexOf(idxObj) === -1) { def[i].push(idxObj); } } } } else { if (isNaN(obj[i]) || i.indexOf('_key') > -1){ def[i] = obj[i]; } else{ def[i] += obj[i]; } } } return def; }
Zum Beispiel gibt es die folgenden zwei Objekte:
var data1 = { "_id" : "577327c544bd90be508b46cc", "channelId_info" : [ { "channelId_key" : "0", "secondLevel_group" : [ { "secondLevel_key" : "568cc36c44bd90625a045c60", "sender_group" : [ { "sender_key" : "577327c544bd90be508b46cd", "sender_sum" : 40.0 } ], "senders_sum" : 40.0 } ], "channelId_sum" : 40.0 } ], "car_sum" : 40.0 }; var data2 = { "_id" : "577327c544bd90be508b46cc", "channelId_info" : [ { "channelId_key" : "0", "secondLevel_group" : [ { "secondLevel_key" : "568cc36c44bd90625a045c60", "sender_group" : [ { "sender_key" : "577327c544bd90be508b46cd", "sender_sum" : 20.0 }, { "sender_key" : "5710bcc7e66620fd4bc0914f", "sender_sum" : 5.0 } ], "senders_sum" : 25.0 }, { "secondLevel_key" : "55fbeb4744bd9090708b4567", "sender_group" : [ { "sender_key" : "5670f993a2f5dbf12e73b763", "sender_sum" : 10.0 } ], "senders_sum" : 10.0 } ], "channelId_sum" : 35.0 }, { "channelId_key" : "1", "secondLevel_group" : [ { "secondLevel_key" : "568cc36c44bd90625a045c60", "sender_group" : [ { "sender_key" : "577327c544bd90be508b46cd", "sender_sum" : 20.0 } ], "senders_sum" : 20.0 } ], "channelId_sum" : 20.0 } ], "car_sum" : 55.0 };
Das Ergebnis nach dem Zusammenführen lautet wie folgt:
{ "_id": "577327c544bd90be508b46cc", "channelId_info": [ { "channelId_key": "0", "secondLevel_group": [ { "secondLevel_key": "568cc36c44bd90625a045c60", "sender_group": [ { "sender_key": "577327c544bd90be508b46cd", "sender_sum": 60 }, { "sender_key": "5710bcc7e66620fd4bc0914f", "sender_sum": 5 } ], "senders_sum": 65 }, { "secondLevel_key": "55fbeb4744bd9090708b4567", "sender_group": [ { "sender_key": "5670f993a2f5dbf12e73b763", "sender_sum": 10 } ], "senders_sum": 10 } ], "channelId_sum": 75 }, { "channelId_key": "1", "secondLevel_group": [ { "secondLevel_key": "568cc36c44bd90625a045c60", "sender_group": [ { "sender_key": "577327c544bd90be508b46cd", "sender_sum": 20 } ], "senders_sum": 20 } ], "channelId_sum": 20 } ], "car_sum": 95 }
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung spezifischer Anwendungscodebeispiele zum Zusammenführen von Objekten in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!