数组转树
将input数据格式转换为output数据格式
let input = [{
id: 1, val: '学校', parentId: null
},{
id: 2, val: '班级1', parentId: 1
},{
id: 3, val: '班级2', parentId: 1
},{
id: 4, val: '学生1', parentId: 2
},{
id: 5, val: '学生2', parentId: 3
},{
id: 6, val: '学生3', parentId: 3
}]
let output = {
id: 1,
val: '学校',
children: [{
id: 2,
val: '班级1',
children: [
{
id: 4,
val: '学生1',
children: null
}
]
}, {
id: 3,
val: '班级2',
children: [
{
id: 5,
val: '学生2',
children: null
},{
id: 6,
val: '学生3',
children: null
}
]
}]
}
实现方式 使用递归只有一个根节点
const arrayToTree = (metadata = input) => {
const { id, val } = metadata.find((item) => item.parentId === null);
const root = {
id,
val,
children: [],
};
const transfer = (id, data) => {
let children = [];
for (let i = 0; i < data.length; i++) {
const item = data[i];
if (item.parentId === id) {
children.push({
id: item.id,
val: item.val,
children: transfer(item.id, data),
});
}
}
return children;
};
root.children = transfer(root.id, metadata);
return root;
};
不使用递归,利用复杂数据类型(对象)赋值为内存索引地址值
const listToTree = (
data = [
{ id: 1, title: "child1", parentId: 0 },
{ id: 2, title: "child2", parentId: 0 },
{ id: 3, title: "child1_1", parentId: 1 },
{ id: 4, title: "child1_2", parentId: 1 },
{ id: 5, title: "child2_1", parentId: 2 },
{ id: 6, title: "child1_2", parentId: 5 },
]
) => {
let map = {};
let treeData = [];
data.forEach((item) => {
map[item.id] = { ...item, children: [] };
});
for (const key in map) {
const item = map[key];
if (item.parentId === 0) {
treeData.push(item);
} else {
map[item.parentId].children.push(item);
}
}
return treeData;
};
以自己现在的努力程度,还没有资格和别人拼天赋

浙公网安备 33010602011771号