在日常开发中我们经常会碰到树结构数据,以下是我的笔记:
const arr =[
{id:2,name:'部门B',parentId:0},
{id:3,name:'部门C',parentId:1},
{id:1,name:'部门A',parentId:2},
{id:4,name:'部门D',parentId:1},
{id:5,name:'部门E',parentId:2},
{id:6,name:'部门F',parentId:3},
{id:7,name:'部门G',parentId:2},
{id:8,name:'部门H',parentId:4}
];
function toTree (data, pId) {
const loop = parentId => {
const res = []
data.forEach(item => {
if (item.parentId === parentId) {
item.children = loop(item.id)
res.push(item)
}
})
return res
}
return loop(pId)
}
function treeToArr(data) {
const result = [];
data.forEach(item => {
const loop = data => {
result.push({
id: data.id,
name: data.name,
parentId: data.parentId
});
let child = data.children
if(child){
for(let i = 0; i < child.length; i++){
loop(child[i])
}
}
}
loop(item);
})
return result;
}
function readTree(data) {
data.forEach(item => {
const loop = data => {
let child = data.children
if(child){
for(let i = 0; i < child.length; i++){
loop(child[i])
}
}
console.log(data);
// 可以在这里做一些遍历的操作
}
loop(item);
})
}
function deleteTree(tree, deleteId) {
let treeData = JSON.parse(JSON.stringify(tree));
const deleteParentNode = data => {
const ret = [];
for (let i = 0, l = data.length; i < l; i++) {
const node = data[i];
if (node.id !== deleteId) {
ret.push(node);
}
if (!!node.children) {
node.children = deleteParentNode(node.children);
}
}
return ret;
};
return deleteParentNode(treeData);
}
function addTree(tree, parentId, addNodeData) {
// parentId 父节点id
let treeData = JSON.parse(JSON.stringify(tree));
const addNode = data => {
const ret = [];
for (let i = 0, l = data.length; i < l; i++) {
const node = data[i];
ret.push(node);
if (!!node.children) {
if (node.id === parentId) {
node.children = addNode([...node.children, ...addNodeData]);
} else {
node.children = addNode(node.children);
}
}
}
return ret;
};
return addNode(tree);
}