问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-07 01:00

我来回答

2个回答

懂视网 时间:2022-05-14 23:00

下面这篇文章主要给大家介绍了在Node.js中如何合并两个复杂对象的方法,文中给出了详细的示例代码,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友可以参考,下面来一起看看吧。

前言

相信大家都知道在通常情况下,在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类型的值自动相加。

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

合并之后的结果如下:

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

热心网友 时间:2022-05-14 20:08

Node.js中合并两个复杂对象代码如下:
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
}
]
};
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
不干胶印刷设备多少钱一套 小型不干胶印刷机价格 什么是走水运 水路的特点是什么 疯狂僵尸机游戏怎么玩,植物大战僵尸高清版怎么玩 植物大战僵尸2 植物大战僵尸2戴夫最好的朋友是谁? 怎么下载疯狂的戴夫游戏 游戏下载地址 小红书数据分析工具推荐 三分钟做好一张小红书封面,不同平台超好用的高效率工具你造吗_百度知... 网球王子的剧场版都有哪些啊 网球王子剧场版:英国式庭球城决战DVD情报 js匹配一个对象中key的值进行合并到新的对象 js对象如何提取并合并成新数组? 一个大学生应当具备哪些素质? 大学生需要什么样的精神引导自己? 大学生应该具备哪些思想道德素质? 2021年中国银行有没有倒闭城市 PS中使用单行选区选择的多个选区的距离要怎么才能调整成等距? 在ps中如何实现选区的水平等距分布,简单方便的办法,,,急! PS如何绘制等距的单行选区? PS里怎么用线把一个圆等距离分割 且线多余的部分要去掉 15公斤哑铃适合什么人 国标19645的鲜牛奶用热水温一下喝正确吗 15公斤哑铃适合我吗 哑铃15斤重吗? 为什么鲜牛奶不能灭菌? 新手求教:哑铃侧平举的重量与哑铃卧推的重量一样大吗 卧推15kg的哑铃算废物吗,我身高175体重180 用15公斤的哑铃做卧推、飞鸟能把胸肌练厚吗? 15公斤的哑铃,每天怎么练才能更好锻炼肌肉 个人房产证明在哪里打河南省政务网里哪个土方打印? js中怎么合并相同数组对象数据 javascript合并两个json对象 在javascript中,有两个树结构的json或js对象,能否将第二个对象归并到... require.js 可以使用$extend合并配置吗 用了requirejs为什么还要合并文件 i5 4460 配GT760 2G DDR3 1600 8G内存条 可以玩cf和联盟吗? 快手主播封号了当场直播的收益是怎么算? 笔记本内存条一个是DDR3-1600和一个DDR31330放在一起玩游戏怎么样? 关于请问孕妇染上&#39;红眼病&#39;应如何治疗?的问题 新界泵业股票什么时候复牌 孕妇得了红眼病,该怎么办 12G的DDR3 1333内存条和12G DDR3 1600的内存条玩游戏方面区别大不? 孕9周+4了,得了红眼病,怎么办那~~~ 1600的内存和1333的内存玩游戏区别大吗? 孕妇感染红眼病怎么办?可以用珍珠明目滴眼液吗? 电脑内存条的频率的大小对玩游戏有什么影响,比如1333频率的和1600频率的差别有多大?求详细解说 老公查出红眼病,我是孕妇怎么预防! 新蔡乡镇公务员考试好考吗 800Hz的4g内存条和1600Hz的4g内存条玩游戏有什么区别 衡南县乡镇公务员好考吗