js 實現 多層級對象合並
首先
需求是使用js對數據的格式進行轉換 把一個二維數組(包含層級信息,層級數是不固定的)list 轉換為多層級的對象
我的思路就是 循環先把list里單條信息轉換為 多層級對象 然后和上一條 進行合並
原數據類型:
[{
id:a_a1_a2,
value:1
},{
id:a_a2_a2,
value:2
},{
id:b_b1,
value:3
}]
分別轉換為:
[a{
a1{
a2:1
}
}]
[a{
a2{
a2:2
}
}]
[b{
b1:3
}]
最終合並效果:
{a{
a1{
a2:1
},
a2{
a2:2
}
},
b{
b1:3
}
}
onSubmit(): void {
// 整理 item 數據
let itemsListInfo = {};
//this.addItemListData 存放的原始數據
for (let i = 0; i < this.addItemListData.length; i++) {
const itemTree = this.addItemListData[i].id.split('_');
// 按照格式整理 當前item
let thisItemInfo = {};
for (let y = itemTree.length - 1; y >= 0; y--) {
if (y === itemTree.length - 1) {
thisItemInfo[itemTree[y]] = this.addItemListData[i].value;
} else {
// 如果直接賦值 會出現問題 需要使用另一個變量暫存
const data = thisItemInfo;
thisItemInfo = {};
thisItemInfo[itemTree[y]] = data;
}
}
console.log(thisItemInfo);
// 合並當前item 到itemListInfo
const itemTreeIndex = 0;
itemsListInfo = this.margeItem(itemsListInfo, thisItemInfo, itemTree, itemTreeIndex, this.addItemListData[i]);
}
}
margeItem(itemsListInfo: any, thisItemInfo: any, itemTree: any, itemTreeIndex: number, addItemListData: any): any {
// 遞歸 判斷是否存在相同層級
// 直到 沒有相同層級后 合並對象到上一級
// 注意 如果是初次進入(沒有上一級) 就直接賦值
if (itemsListInfo.hasOwnProperty(itemTree[itemTreeIndex])) {
itemsListInfo[itemTree[itemTreeIndex]]
= this.margeItem(
itemsListInfo[itemTree[itemTreeIndex]],
thisItemInfo[itemTree[itemTreeIndex]],
itemTree,
itemTreeIndex + 1,
addItemListData
);
return itemsListInfo;
} else {
let lastData = {};
if (itemsListInfo.hasOwnProperty(itemTree[itemTreeIndex - 1])) {
lastData = itemsListInfo[itemTree[itemTreeIndex - 1]];
lastData[itemTree[itemTreeIndex]] = thisItemInfo[itemTree[itemTreeIndex]];
} else {
lastData = thisItemInfo[itemTree[itemTreeIndex]];
}
itemsListInfo[itemTree[itemTreeIndex]] = lastData;
return itemsListInfo;
}
}
最后itemsListInfo就是我需要的最終格式