Node.js中如何合并两个复杂对象详解
前言
相信大家都知道在通常情况下,在Node.js中我们可以通过underscore的extend或者lodash的merge来合并两个对象,但是对于像下面这种复杂的对象,要如何来应对呢?下面来一起学习学习吧。
Node.js合并两个复杂对象
例如我有以下两个object:
varobj1={ "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 } ] }; varobj2={ "name":"myname", "status":1, "newfield":1, "profile":{"isactive":false,"city":"newYork"}, "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:'newYork'}, 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}
通过underscore或者lodash现有的方法我们无法实现上述结果,那只能自己写代码来实现了。
functionmergeObjs(def,obj){ if(!obj){ returndef; }elseif(!def){ returnobj; } for(variinobj){ //ifitsanobject if(obj[i]!=null&&obj[i].constructor==Object) { def[i]=mergeObjs(def[i],obj[i]); } //ifitsanarray,simplevaluesneedtobejoined.Objectvaluesneedtoberemerged. elseif(obj[i]!=null&&(obj[i]instanceofArray)&&obj[i].length>0) { //testtoseeifthefirstelementisanobjectornotsoweknowthetypeofarraywe'redealingwith. if(obj[i][0].constructor==Object) { varnewobjs=[]; //createanindexofalltheexistingobjectIDsforquickaccess.Thereisnowaytoknowhowmanyitemswillbeinthearrays. varobjids={} for(varx=0,l=def[i].length;x<l;x++) { objids[def[i][x].id]=x; } //nowwalkthroughtheobjectsinthenewarray //iftheIDexists,thenmergetheobjects. //iftheIDdoesnotexist,pushtotheendofthedefarray for(varx=0,l=obj[i].length;x<l;x++) { varnewobj=obj[i][x]; if(objids[newobj.id]!==undefined) { def[i][x]=mergeObjs(def[i][x],newobj); } else{ newobjs.push(newobj); } } for(varx=0,l=newobjs.length;x<l;x++){ def[i].push(newobjs[x]); } } else{ for(varx=0;x<obj[i].length;x++) { varidxObj=obj[i][x]; if(def[i].indexOf(idxObj)===-1){ def[i].push(idxObj); } } } } else { def[i]=obj[i]; } } returndef;}
将上述代码稍作改进,我们可以实现在合并过程中将Number类型的值自动相加。
functionmerge(def,obj){ if(!obj){ returndef; } elseif(!def){ returnobj; } for(variinobj){ //ifitsanobject if(obj[i]!=null&&obj[i].constructor==Object) { def[i]=merge(def[i],obj[i]); } //ifitsanarray,simplevaluesneedtobejoined.Objectvaluesneedtobere-merged. elseif(obj[i]!=null&&(obj[i]instanceofArray)&&obj[i].length>0) { //testtoseeifthefirstelementisanobjectornotsoweknowthetypeofarraywe'redealingwith. if(obj[i][0].constructor==Object) { varnewobjs=[]; //createanindexofalltheexistingobjectIDsforquickaccess.Thereisnowaytoknowhowmanyitemswillbeinthearrays. varobjids={} for(varx=0,l=def[i].length;x<l;x++) { objids[def[i][x].id]=x; } //nowwalkthroughtheobjectsinthenewarray //iftheIDexists,thenmergetheobjects. //iftheIDdoesnotexist,pushtotheendofthedefarray for(varx=0,l=obj[i].length;x<l;x++) { varnewobj=obj[i][x]; if(objids[newobj.id]!==undefined) { def[i][x]=merge(def[i][x],newobj); } else{ newobjs.push(newobj); } } for(varx=0,l=newobjs.length;x<l;x++){ def[i].push(newobjs[x]); } } else{ for(varx=0;x<obj[i].length;x++) { varidxObj=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]; } } } returndef; }
例如有以下两个对象:
vardata1={ "_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 }; vardata2={ "_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 };
合并之后的结果如下:
{ "_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 }
总结
以上就是这篇文章的全部内容了,文中提到的上述代码在日常工作中很有用,值得大家收藏!希望本文的内容对大家的学习或者工作能带来一定的帮助。