跳到主要内容
版本:Next

数组转树

const testData = [
{ id: 1, parentId: "", name: "第三方" },
{ id: 2, parentId: 1, name: "第三方" },
{ id: 3, parentId: 1, name: "第三方" },
{ id: 4, parentId: 1, name: "第三方" },
{ id: 5, parentId: "", name: "第三方" },
{ id: 6, parentId: "", name: "第三方" },
{ id: 1, parentId: "", name: "第434343方" },
];

1.普通遍历

function listToTree(data) {
// * 先生成parent建立父子关系
const obj = {};
data.forEach((item) => {
obj[item.id] = item;
});
// * obj -> {1001: {id: 1001, parentId: 0, name: 'AA'}, 1002: {...}}
// console.log(obj, "obj")
const parentList = [];
data.forEach((item) => {
const parent = obj[item.parentId];
if (parent) {
// * 当前项有父节点
parent.children = parent.children || [];
parent.children.push(item);
} else {
// * 当前项没有父节点 -> 顶层
parentList.push(item);
}
});
return parentList;
}

2.reduce

function array2tree(array) {
return JSON.parse(JSON.stringify(array)).reduce((pre, next) => {
const { id, parentId } = next;
if (pre[parentId]) {
pre[parentId].children = (pre[parentId].children || []).concat([next]);
} else {
if (pre[id]) {
pre[id] = { ...pre[id], ...next };
} else {
pre[id] = next;
}
}
return pre;
}, {});
}