面试题1
答案都是自己想的,可能不对
/ 输入
const flatTreeData = [
{ id: '1', parentId: '0' },
{ id: '1-1', parentId: '1' },
{ id: '1-1-1', parentId: '1-1' },
{ id: '1-2', parentId: '1' },
{ id: '1-3', parentId: '1' },
{ id: '2', parentId: '0' },
{ id: '2-1', parentId: '2' },
{ id: '2-2', parentId: '2' },
{ id: '2-3', parentId: '2' },
];
/ 输出
const buildTree = {
id: '0',
children: [
{
id: '1',
children: [{ id: '1-1', children: [{ id: '1-1-1' }] }, { id: '1-2' }, { id: '1-3' }],
},
{
id: '2',
children: [{ id: '2-1' }, { id: '2-2' }, { id: '2-3' }],
},
],
};
function arrayToTree(array) {
const map = new Map();
let tree = {
id: '0',
children: []
};
array.forEach(item => {
map.set(item.id,{...item, children: []})
});
array.forEach(item => {
if (item.parentId !== '0') {
const parentNode = map.get(item.parentId)
parentNode.children.push(map.get(item.id))
map.set(item.parentId,parentNode)
} else {
tree.children.push(map.get(item.id))
}
});
return tree;
}
代码思路
- 首先利用map,把数组的id和需要的数据结构结合起来,{id: 0 , children: []}
- 遍历数组,如果有parentId,通过map,可以把当前的值,存入父节点的children,如果没有parentId,直接存入根节点。遍历完就得到了最后的数据