ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(一个人的激情和理想越多,就越幸福。 —— 夏洛特·凯瑟琳)
ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
const arr = [
{
"id": 0,
"name": "公司",
"parent_id": -1
},
{
"id": -2,
"name": "行政",
"parent_id": 0
},
{
"id": -3,
"name": "产品",
"parent_id": 0
},
{
"id": -4,
"name": "产品运营",
"parent_id": -3
},
{
"id": 1,
"name": "客服",
"parent_id": 0
},
{
"id": 2,
"name": "运维",
"parent_id": 0
},
{
"id": 3,
"name": "销售部",
"parent_id": 0
},
{
"id": 4,
"name": "研发",
"parent_id": 0
},
{
"id": 5,
"name": "前端",
"parent_id": 4
},
{
"id": 6,
"name": "后端",
"parent_id": 4
},
{
"id": 7,
"name": "架构",
"parent_id": 6
},
{
"id": 8,
"name": "数据库",
"parent_id": 6
},
{
"id": 9,
"name": "开发",
"parent_id": 6
}
];
// 先找到根节点
let root = null;
for (var i = 0; i < arr.length; i++) {
// 获取父节点id
const parent_id = arr[i].parent_id;
// 判断当前节点是否能找到父节点
const isChildren = arr.some((v) => v.id === parent_id);
// 找不到则证明是根节点
if (!isChildren) {
root = arr[i];
break;
}
}
const loop = (node) => {
// 获取节点id
const nodeId = node.id;
// 找到该节点的子节点列表
const childernList = arr.filter((v) => v.parent_id === nodeId);
// 如果没有子节点则不进行处理
if (!childernList.length > 0) {
return;
}
// 如果有子节点,则将子节点复制给该节点的children
node.children = childernList;
// 然后继续递归子节点,找子节点的
for (var i = 0; i < childernList.length; i++) {
loop(childernList[i]);
}
};
loop(root);
console.log(JSON.stringify(root));
{
"id":0,
"name":"公司",
"parent_id":-1,
"children":[
{
"id":-2,
"name":"行政",
"parent_id":0
},
{
"id":-3,
"name":"产品",
"parent_id":0,
"children":[
{
"id":-4,
"name":"产品运营",
"parent_id":-3
}
]
},
{
"id":1,
"name":"客服",
"parent_id":0
},
{
"id":2,
"name":"运维",
"parent_id":0
},
{
"id":3,
"name":"销售部",
"parent_id":0
},
{
"id":4,
"name":"研发",
"parent_id":0,
"children":[
{
"id":5,
"name":"前端",
"parent_id":4
},
{
"id":6,
"name":"后端",
"parent_id":4,
"children":[
{
"id":7,
"name":"架构",
"parent_id":6
},
{
"id":8,
"name":"数据库",
"parent_id":6
},
{
"id":9,
"name":"开发",
"parent_id":6
}
]
}
]
}
]
}