算法:将列表还原为树状结构

发布于 2023-12-15 12:38:20 字数 1384 浏览 35 评论 0

题目

给定一个列表,数据格式如下:

const list = [
  { pid: null, id: 1, data: "1" },
  { pid: 1, id: 2, data: "2-1" },
  { pid: 1, id: 3, data: "2-2" },
  { pid: 2, id: 4, data: "3-1" },
  { pid: 3, id: 5, data: "3-2" },
  { pid: 4, id: 6, data: "4-1" },
]

请你写一个函数,将列表转换成树状结构,转换后的格式如下:

[
  {
    pid: null,
    id: 1,
    data: '1',
    children: [
      {id: 2, pid: 1, data: '2-1'},
      {id: 3, pid: 1, data: '2-2'},
    ]
  }
]

解法

第一种:采用递归来做

function listToTree(list, id = null) {
  return list.reduce((acc, item) => {
    if (item.pid === id) {
      const children = listToTree(list, item.id)
      if (children.length) {
        item.children = children
      }
      return [...acc, item]
    }
    return acc
  }, [])
}

第二种:采用迭代,先用一个哈希表,以 id 为 key 存储对应的项,再申请一个 res 数组,找到根节点 push,同时根据 pid 找到哈希表的键插入 children。因为 JS 引用类型属性是共享的,所以对哈希表的项修改,也会反应在 res 数组中

function listToTree(list) {
    let res = []
    let map = {}
    for (let i = 0; i < list.length; i++) {
        map[list[i].id] = list[i]
        list[i].children = []
    }
    for (let i = 0; i < list.length; i++) {
        if (list[i].pid === null) {
            res.push(list[i])
        } else {
            map[list[i].pid].children.push(list[i])
        }
    }
    return res
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

独享拥抱

暂无简介

文章
评论
28 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文