在前端開發中,我們常常會遇到將數組轉成樹形結構的需求。這個需求一般會出現在我們需要將一些數據進行層級展示的情況下,如菜單、目錄結構等。在這篇文章中,我們將會討論javascript中如何將一個數組轉成樹形結構。
假設我們有以下一個數組:
const array = [
{id: 1, parentId: null, label: 'Level 1-1'},
{id: 2, parentId: null, label: 'Level 1-2'},
{id: 3, parentId: null, label: 'Level 1-3'},
{id: 4, parentId: 1, label: 'Level 2-1'},
{id: 5, parentId: 1, label: 'Level 2-2'},
{id: 6, parentId: 2, label: 'Level 2-3'},
{id: 7, parentId: 4, label: 'Level 3-1'},
{id: 8, parentId: 6, label: 'Level 3-2'},
];
以上數組中,每個元素包含三個屬性:id,parentId和label。其中id表示該元素的唯一標識符,parentId表示該元素的父元素的唯一標識符,label表示該元素的名稱。如果該元素沒有父元素,則其parentId的值為null。
現在我們需要將以上數組轉成以下的樹形結構:
[
{
id: 1,
label: 'Level 1-1',
children: [
{
id: 4,
label: 'Level 2-1',
children: [
{
id: 7,
label: 'Level 3-1',
children: []
}
]
},
{
id: 5,
label: 'Level 2-2',
children: []
}
]
},
{
id: 2,
label: 'Level 1-2',
children: [
{
id: 6,
label: 'Level 2-3',
children: [
{
id: 8,
label: 'Level 3-2',
children: []
},
]
}
]
},
{
id: 3,
label: 'Level 1-3',
children: []
}
]
我們可以通過以下的代碼實現以上的需求:
function convertToTree(data) {
const map = {};
const result = [];
data.forEach(item =>{
map[item.id] = item;
item.children = [];
});
data.forEach(item =>{
if (item.parentId === null) {
result.push(item);
} else {
map[item.parentId].children.push(item);
}
});
return result;
}
const result = convertToTree(array)
console.log(result)
在以上的代碼中,我們定義了一個convertToTree函數,該函數接受一個數組作為參數,返回一個樹形結構的數組。首先,我們創建了一個map對象,用于將每個元素的id映射到該元素本身。接著,我們遍歷了一遍data數組,將每個元素加入到map對象中,同時也將該元素的children屬性初始化為空數組。接下來,我們再次遍歷了一遍data數組,對于每個元素,如果其parentId為null,則將該元素加入到根節點數組result中,否則,我們可以通過map對象找到該元素的父節點,并將該節點加入到父節點的children屬性數組中。最后返回result數組即可。
除了以上的方法,我們還可以使用遞歸的方法來將數組轉成樹形結構,代碼如下:
function convertToTree(data, parentId = null) {
const result = [];
data.forEach(item =>{
if (item.parentId === parentId) {
item.children = convertToTree(data, item.id);
result.push(item);
}
});
return result;
}
const result = convertToTree(array)
console.log(result)
在以上的代碼中,我們定義了一個convertToTree函數,該函數接受兩個參數:一個是要轉換的數組data,另一個是當前節點的parentId。在函數體內,我們首先定義了一個result數組,用于存放當前parentId的子節點數組。接著,我們遍歷了一遍data數組,對于每個元素,如果其parentId等于當前的parentId,則將該元素加入到result數組中,并遞歸調用convertToTree函數,找到該元素的子節點并將其加入該元素的children屬性中。最后返回result數組即可。
無論是使用類似map對象的方法還是使用遞歸的方式,將數組轉換成樹形結構都是比較常見的操作。希望以上的代碼和介紹能夠幫助讀者更好地理解這一過程。