Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- How to Optimize Merge of Two Objects That Include Arrays of Objects
- var utils = require("util");
- function mergeObjs(def, obj) {
- if (typeof obj == 'undefined') {
- return def;
- } else if (typeof def == 'undefined') {
- 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 && utils.isArray(obj[i]) && 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;}
- 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
- }
- ]
- };
- { 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 }
Add Comment
Please, Sign In to add comment