请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

这个方法好像有问题

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

正在回答 回答被采纳积分+3

2回答

起点丶 2022-06-25 21:47:52
// 这样写就不怕顺序问题了,不过要两次循环,先准备 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 回复 有任何疑惑可以回复我~
  • 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 },
      ]
    这种结构不行
    回复 有任何疑惑可以回复我~ 2022-06-27 11:30:34
  • 先排序,再遍历
    回复 有任何疑惑可以回复我~ 2022-06-30 00:21:14
  • 你这已经不是一个树了,是两个树  id=1 和 id=10 parentId 都是0,应该返回数组来表示才行
    回复 有任何疑惑可以回复我~ 2022-07-01 11:20:18
双越 2022-02-28 17:58:54

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

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信