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

node js 怎么合并两个数组

发布网友 发布时间:2022-04-30 07:37

我来回答

2个回答

懂视网 时间:2022-04-22 22:02

下面这篇文章主要给大家介绍了在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-04-22 19:10

var a = [ 1, 2, 3 ];
var b = [ 4, 5, 6 ];
var c = a.concat(b);

console.info(c);
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
招商银行的美元天添金怎么样? 天添美蒸馒头为什么开裂呢 上海食堂送菜 邮政跨地区取款手续费多? 谁能告诉我邮政储蓄卡跨省取钱要不要收费啊? 自贡市龙盛世纪仿真模型制造有限公司公司简介 学PS真的很难吗 红烧萝卜牛筋 微信怎么转发公众号部分内容 转发公众号部分内容方法 微信公众号内的视频如何下载?一个F12搞定 js 多个数组合并 每一个值对应一个数组 JS合并数组的几种方法及优劣比较 js如何通过相同键值合并两个json数组 js中数组合并问题,用concat方法处理 js 数组 怎么把这个两个数组合并成JSon数组? js 规定位置的数组合并 js让两个一维数组的值合并 js 两个数组合并从小到大排序 怎么把两个js 数组过滤合并成一个数组?谢谢 js中数组合并 js如何合并两个数组并删除重复的项 js 数组合并 JavaScript如何合并俩个array 各位js大神,请教以下如下俩个对象数组如何合并为一个? javascript 两个 数组 怎么 合并 显示 招商银行的银行卡长期不用会自动注销吗? 招商银行账号怎么注销? 招商银行储蓄卡柜台办理注销后是否能重新启用? 被封需要好友验证,没有好友验证怎么办? 手机的wifi搜不到自己的无线信号怎么办,别人的机却能搜到自己的信号 “打水漂”中“漂”的读音 打水漂的词语释义 什么叫打水漂? 打水漂的另一个意思是什么? 打水漂猜三个数 恒兴隆的拼音 请高手算下命! 形容无济于事,徒劳无功的词语有哪些? 水瓢是什么意思 知难而退 的繁体字怎么写? 高尔基的《海燕》这篇文章主要讲了什么? 50元人民币错版值多少钱 为什么要在申请商标之前做商标名称检索啦,有什么好处,具体要怎样检索呢? 3q大战 ,愤怒的网友…… 清问百度:99版100元的旁边没有yuAN的拼音字,是不错版币呢,没yuAN这样的拼字也不是错版吗 HYC是叫什么显示器啊? mysql中如何导入外部sql文件,举例说明 向日葵远程怎么关闭输入法 热带雨林是什么气候 什么是热带雨林气候?