首页 > 语言 > JavaScript > 正文

Node.js中如何合并两个复杂对象详解

2024-05-06 15:03:41
字体:
来源:转载
供稿:网友

前言

相信大家都知道在通常情况下,在Node.js中我们可以通过underscore的extend或者lodash的merge来合并两个对象,但是对于像下面这种复杂的对象,要如何来应对呢?下面来一起学习学习吧。

Node.js合并两个复杂对象

例如我有以下两个object:

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 }

通过underscore或者lodash现有的方法我们无法实现上述结果,那只能自己写代码来实现了。

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

将上述代码稍作改进,我们可以实现在合并过程中将Number类型的值自动相加。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选