题目
给出一个数组:
arr = [
{id: 1, name: '部门1', pid: 0},
{id: 2, name: '部门2', pid: 1},
{id: 3, name: '部门3', pid: 1},
{id: 4, name: '部门4', pid: 3},
{id: 5, name: '部门5', pid: 4},
]
其中pid表示此元素对象是id为对应值所在对象的children中的一员,如下所示:
// 这里仅仅展示了第一个元素的样子
target = [
{
id: 1,
name: '部门1',
pid: 0,
children: [
{ id: 2, name: '部门2', pid: 1, children: [] },
{ id: 3, name: '部门3', pid: 1, children: [Array] }
]
}
]
暴力解法
let arr = [
{id: 1, name: '部门1', pid: 0},
{id: 2, name: '部门2', pid: 1},
{id: 3, name: '部门3', pid: 1},
{id: 4, name: '部门4', pid: 3},
{id: 5, name: '部门5', pid: 4},
]
function getTarget (arr) {
let target = [...arr];
target.map(x => {x.children = []});
for(let i =0; i < target.length - 1; i++){
for(let j = i + 1; j < target.length; j++){
if(target[i].id === target[j].pid){
target[i].children.push(target[j]);
}
}
}
return target;
}
console.log(getTarget(arr)[0]);
优化解法
按照for循环遍历原数组,取出其中的pid,其中pid的值对应着id,由于数据可能是乱序的,所以可以使用hashmap先将id的值作为键值,索引作为值存储起来,再对pid进行遍历判断。
let arr = [
{id: 1, name: '部门1', pid: 0},
{id: 2, name: '部门2', pid: 1},
{id: 3, name: '部门3', pid: 1},
{id: 4, name: '部门4', pid: 3},
{id: 5, name: '部门5', pid: 4},
]
function getTarget (arr) {
let target = [...arr];
let map = new Map();
for(let i = 0; i < target.length; i++){
target[i].children = [];
map.set(target[i].id, i);
}
for(let i =0; i < target.length; i++){
let temp = target[i].pid;
if(map.has(temp)){
let ans = map.get(temp);
target[ans].children.push(target[i]);
} else continue;
}
return target;
}
console.log(getTarget(arr)[0]);