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
}
总结
以上就是这篇文章的全部内容了,文中提到的上述代码在日常工作中很有用,值得大家收藏!希望本文的内容对大家的学习或者工作能带来一定的帮助。