遇到一個(gè)結(jié)構(gòu)比較復(fù)雜的對(duì)象,夜不能寐,求大神協(xié)助
基本結(jié)構(gòu)大概是這樣:
[{
aId: 1,
aList: [{
bId: 22,
bList: [{
cId: 333,
cList: [{
dId: 4444,
num: 2
}]
}]
}]
}]
其中每層List中可以包含多個(gè)下級(jí)對(duì)象,比如:
[{
aId: 1,
aList: [{
bId: 22,
bList: [{
cId: 333,
cList: [{
dId: 4444,
num: 2
}, {
dId: 5555,
num: 1
}]
}]
}, {
bId: 33,
bList: [{
cId: 321,
cList: [{
dId: 4123,
num: 1
}]
},
{
cId: 987,
cList: [{
dId: 4193,
num: 1
}]
}
]
}]
}]
需求是,將兩個(gè)這樣的結(jié)構(gòu)合并,分別判斷每層的id是否相同,不同就push到相應(yīng)的list中,相同就繼續(xù)往下遍歷,(如果最后dId也相同,則num++)比如:
var a = [{
aId: 1,
aList: [{
bId: 22,
bList: [{
cId: 333,
cList: [{
dId: 4444,
num: 2
},
{
dId: 5555,
num: 1
}]
}]
}]
}]
var b = [{
aId: 1,
aList: [{
bId: 22,
bList: [{
cId: 333,
cList: [{
dId: 6666,
num: 1
}]
}]
},
{
bId: 33,
bList: [{
cId: 987,
cList: [{
dId: 5678,
num: 1
}]
}]
}
]
}]
console.log(reduce(a,b));
輸出:
[{
aId: 1,
aList: [{
bId: 22,
bList: [{
cId: 333,
cList: [{
dId: 4444,
num: 2
},
{
dId: 5555,
num: 1
},
{
dId: 6666,
num: 1
}
]
}]
}, {
bId: 33,
bList: [{
cId: 987,
cList: [{
dId: 5678,
num: 1
}]
}]
}]
}]
es6、5不限。
把題主的例子稍微復(fù)雜了下,考慮了全部相同導(dǎo)致 num++ 的情況,另,優(yōu)化了代碼
var a = [{
aId: 1,
aList: [{
bId: 22,
bList: [{
cId: 333,
cList: [{
dId: 4444,
num: 2
},
{
dId: 5555,
num: 1
}
]
}]
}]
}];
var b = [{
aId: 1,
aList: [{
bId: 22,
bList: [{
cId: 333,
cList: [{
dId: 5555,
num: 1
}, {
dId: 6666,
num: 1
}]
}]
},
{
bId: 33,
bList: [{
cId: 987,
cList: [{
dId: 5678,
num: 1
}]
}]
}
]
}];
var result = [{
aId: 1,
aList: [{
bId: 22,
bList: [{
cId: 333,
cList: [{
dId: 4444,
num: 2
},
{
dId: 5555,
num: 2
},
{
dId: 6666,
num: 1
}
]
}]
}, {
bId: 33,
bList: [{
cId: 987,
cList: [{
dId: 5678,
num: 1
}]
}]
}]
}];
console.log(JSON.stringify(reduce(a, b)) === JSON.stringify(result)); //true
function reduce(a, b) {
let levelArr = ['a', 'b', 'c', 'd'],
//如果后面還有 e,f,g 只需要修改這里就行;
result = iterateCompareId(a, b, undefined, 'a');
function iterateCompareId(listA, listB, listTemp, level) {
// 保存 listA 的副本,后期把 listB 中的數(shù)據(jù)逐步加給 listTemp,作為函數(shù)返回值;
// 注意這里 listTemp 反復(fù)迭代,但始終指向的是保存在內(nèi)存里的同一個(gè)對(duì)象,一直在修改 listTemp 的數(shù)據(jù);
listTemp = listTemp === undefined ? JSON.parse(JSON.stringify(listA)) : listTemp;
listB.forEach((objB, indexB) => {
//求出當(dāng)前 level 中, listB 中項(xiàng)在 listA 中的索引,不存在,則返回 -1
let IndexOfIdInA = listA.findIndex((objA, indexA) => {
return objA[level + 'Id'] === objB[level + 'Id'];
});
//如果當(dāng)前 level 中,listA 中 沒有 listB 的 id,把 listB 這個(gè)level的數(shù)據(jù)拷給 listTemp
if (IndexOfIdInA === -1) {
listTemp.push(objB);
} else {
//如果有,判斷是否到最后一層
//不是最后一層,切換到下一層 level,繼續(xù)
//是最后一層,listTemp 當(dāng)前層 num+=1;
if (levelArr.indexOf(level) != levelArr.length - 1) {
iterateCompareId(listA[IndexOfIdInA][level + 'List'], objB[level + 'List'], listTemp[IndexOfIdInA][level + 'List'], levelArr[levelArr.indexOf(level) + 1]);
} else {
listTemp[IndexOfIdInA].num += 1;
}
}
});
return listTemp;
}
return result;
}
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。