需求
依据 id
与 parentId
构造父子集关系,将子数据放到父数据的 child
字段中
思路
- 利用
Array
是引用类型值的特点。
例如A,B,C
均为{ child : [] }
,依次进行如下操作
1、A.child.push(B)
2、B.child.push(C)
此时A
中的B
也已经包含了C
- 再利用
filter
将 非根数据 去除 - 注意,
filter
过滤只是浅拷贝,引用关系依旧存在
数据源
let data: [
{ id: 1, text: "1", parentId: 0 },
{ id: 2, text: "2", parentId: 0 },
{ id: 3, text: "1-3", parentId: 1 },
{ id: 4, text: "1-3-4", parentId: 3 },
{ id: 5, text: "2-5", parentId: 2 },
{ id: 6, text: "1-3-6", parentId: 3 }
]
方法:
// root : 根节点 pId 标识
function flat2Tree(
data,
id = "id",
pId = "parentId",
childKey = "child",
root = 0
) {
// 第一次遍历
data.map(it => {
// 如果是 非根数据
if (it[pId] !== root) {
// 进行第二次遍历
data.map(obj => {
// 如果第二次遍历的 id 与 第一次遍历的 pId 相同,证明【第二次遍历的数据】是【第一次】的【父级】
if (obj[id] === it[pId]) {
if (!obj[childKey]) obj[childKey] = [];
obj[childKey].push(it);
}
});
}
});
return data.filter(it => it[pId] === root);
}
使用
let newData = flat2Tree(data)