国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

Node.js中如何合并兩個復雜對象詳解

2024-05-06 16:34:17
字體:
供稿:網(wǎng)友

前言

相信大家都知道在通常情況下,在Node.js中我們可以通過underscore的extend或者lodash的merge來合并兩個對象,但是對于像下面這種復雜的對象,要如何來應(yīng)對呢?下面來一起學習學習吧。

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

希望合并之后的結(jié)果輸出成下面這樣:

{ 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現(xiàn)有的方法我們無法實現(xiàn)上述結(jié)果,那只能自己寫代碼來實現(xiàn)了。

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

將上述代碼稍作改進,我們可以實現(xiàn)在合并過程中將Number類型的值自動相加。

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

例如有以下兩個對象:

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

合并之后的結(jié)果如下:

{ "_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}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,文中提到的上述代碼在日常工作中很有用,值得大家收藏!希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助。


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 大连市| 奇台县| 根河市| 资阳市| 上蔡县| 绵竹市| 汝州市| 故城县| 茶陵县| 仲巴县| 台南市| 阜康市| 错那县| 海丰县| 宣城市| 鄂伦春自治旗| 兰州市| 九寨沟县| 邻水| 兴义市| 金乡县| 云和县| 桦南县| 西乡县| 静安区| 揭阳市| 内江市| 瓦房店市| 通山县| 六枝特区| 云浮市| 辽宁省| 肥东县| 如东县| 博客| 喜德县| 隆尧县| 磐安县| 桂东县| 沙坪坝区| 福海县|