题目
请把该数据整理为树状结构, 该树每个节点的结构如下,
node = { children: [], id: id, value: value }
用例
var data = [{ parentId: 0, id: 1, value: '1' }, { parentId: 3, id: 2, value: '2' }, { parentId: 0, id: 3, value: '3' }, { parentId: 1, id: 4, value: '4' }, { parentId: 1, id: 5, value: '5' }, ];
答案思路:
以map作为存储可以用户快速通过id获取节点,也可以使用字典存储
以parentId为父节点,遍历每个点,然后通过map拿到该parentId的节点,也就是拿到了父parent,
这时候只需要把子(当前节点)放进父里即可,遍历完成就放完了所有子节点。
注意:
处理第一个父节点,判断拿到的parent为空则为他新建一个节点作为头结点,
第二次在拿到空的父节点,不能再建,要复用前面那个
function fn(data) { const map = new Map() data.forEach(item => { map.set(item.id, item) }) let root = null map.forEach((item, i) => { let parent = map.get(map.get(i).parentId) //拿到该节点的父节点 if (!parent) { if (!root) { // 建根 parent = { children: [], id: map.get(i).parentId, value: '' } root = parent } else { // 复用根 parent = root } } parent.children = parent.children ? parent.children : [] let son = map.get(i) delete(son.parentId) son.children ? son.children : son.children = [] parent.children.push(son) }) return root } console.log(fn(data))