这个方法好像有问题

来源:9-5 -把一个数组转换为树

入门级全栈专家

2022-02-28

数组转树,如果过arr里面的id顺序不是123456,而是乱序的话,按这个方法children插入就有问题了吧?

写回答

2回答

起点丶

2022-06-25

// 这样写就不怕顺序问题了,不过要两次循环,先准备 map 
const arr = [
  { id: 1, name: '部门A', parentId: 0 },
  { id: 2, name: '部门B', parentId: 1 },
  { id: 3, name: '部门C', parentId: 1 },
  { id: 4, name: '部门D', parentId: 2 },
  { id: 5, name: '部门E', parentId: 2 },
  { id: 6, name: '部门F', parentId: 3 }
]

function convert(arr) {
  const idToTreeNode = new Map()  // id 和 treeNode 的映射,方便通过 id 找到对应 treeNode
  let tree = null
  // 首次循环填充 map
  arr.forEach(item => {
    const { id, name } = item
    const treeNode = { id, name }
    idToTreeNode.set(id, treeNode)
  })

  // 遍历数组,找到父节点,添加 children
  arr.forEach(item => {
    const { id, parentId } = item
    const parentNode = idToTreeNode.get(parentId)
    if (parentNode) {
      if (parentNode.children == null) parentNode.children = []
      parentNode.children.push(idToTreeNode.get(id))
    } else {
      tree = idToTreeNode.get(id)
    }
  })
  return tree
}

console.log(convert(arr))

           

下载视频          

0
4
起点丶
回复
慕容6596715
const arr = [ { id: 1, name: '部门A', parentId: 0 }, { id: 2, name: '部门B', parentId: 1 }, { id: 3, name: '部门C', parentId: 1 }, { id: 4, name: '部门D', parentId: 2 }, { id: 5, name: '部门E', parentId: 2 }, { id: 6, name: '部门F', parentId: 3 }, { id: 10, name: '部门G', parentId: 0 }, { id: 12, name: '部门H', parentId: 10 }, { id: 23, name: '部门I', parentId: 10 }, { id: 34, name: '部门J', parentId: 12 }, { id: 45, name: '部门K', parentId: 12 }, { id: 56, name: '部门L', parentId: 23 }, ] function convert(arr) { const idToTreeNode = new Map() // id 和 treeNode 的映射,方便通过 id 找到对应 treeNode // let tree = null let treeArr = [] // 首次循环填充 map arr.forEach(item => { const { id, name } = item const treeNode = { id, name } idToTreeNode.set(id, treeNode) }) // 遍历数组,找到父节点,添加 children arr.forEach(item => { const { id, parentId } = item const parentNode = idToTreeNode.get(parentId) if (parentNode) { if (parentNode.children == null) parentNode.children = [] parentNode.children.push(idToTreeNode.get(id)) } else { treeArr.push(idToTreeNode.get(id)) } }) return treeArr } console.log(convert(arr))
2022-07-01
共4条回复

双越

2022-02-28

是的。如果输入不符合预期,那就得调整算法,有了本节的讲解,调整起来也不麻烦。

0
0

2周刷完100道前端优质面试真题 双越最新力作

『前端面试真题100道』视频详解

1509 学习 · 642 问题

查看课程