假如一个数组是平铺的,元素里面没有嵌套另一个数组,但当我们需要嵌套数组的时候,怎么才能把它转化成树形结构呢
数组结构如下:
1.我们首先需要把每个数组元素都加上一个children属性,用于存储二级数组
2.然后创建一个map空对象,把数组每个元素的id值作为对象的(属性)key,把数组元素作为key值,加到空对象里面,这样我们就可以得到一个key为id值,key值为数组元素的一个对象,并且对象里面每一项都有一个空数组children
3.先创建一个空数组,用来接收树形结构的数组,然后遍历数组,
(1) 如果pid为空的话就证明他是一级菜单,就添加到空数组里面;
(2) 如果pid的值有与之对应的id值,说明该pid项为该id项的子菜单,就把他加到children属性里面
注意:以上操作都是引用数据类型,会改变原有的数组,所以3.2中添加到map的children属性里面,也同样会在最初的数组中生成,创建的空数组也同样有
代码如下:
function tranListToTreeData(list) {
let treeList = []
let map = {}
list.forEach(item => {
item.children = []
map[item.id] = item
})
list.forEach(item => {
const res = map[item.pid]
if (res) {
res.children.push(item)
} else {
treeList.push(item)
}
})
return treeList
}