1. 程式人生 > >js 實現 多層級物件合併

js 實現 多層級物件合併

# 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
}
}
```

 

```js

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就是我需要的最終