JS递归算法实现 数组 转 树结构
- 根节点只有一个
function retrieve(arr) {
//找出根节点
let root = arr.find((val) => val.parent_id === null);
return recursion(root, arr);
}
function recursion(element, arr) {
let id = element.id;
let childrens = arr.filter(v => v.parent_id === id);
//如果存在子节点,对子节点进行递归算法
childrens.length && childrens.forEach((v) => recursion(v, arr));
//获取当前元素在数组中的所有子节点
element.children = element.children ? element.children.concat(childrens) : [...childrens]
}
//将此数组转为树结构对象
let tree = retrieve([
{id: 1, parent_id: null},
{id: 2, parent_id: 1},
{id: 3, parent_id: 1},
{id: 4, parent_id: 2},
{id: 5, parent_id: 4}]
);
console.log(tree);
得到树结构如下:
根节点对象
2.多个根节点
上例是指定只有一个根节点,可以快捷地找出父节点下的子节点,现在将上面例子改为 通用算法:
function recursion(arr, id) {
return Array.isArray(arr) && arr.filter((v) => v.parent_id === id).map((v) => ({...v, children: recursion(arr, v.id)}))
}
let tree = recursion([
{id: 1, parent_id: null},
{id: 2, parent_id: null},
{id: 3, parent_id: 1},
{id: 4, parent_id: 2},
{id: 5, parent_id: 4}], null);
console.log(tree);
得到树结构数组:
根节点数组
网友评论