数组转树的写法,求指教?

作者站长头像
站长
· 阅读数 9

给定:

const source = [
  { id: 19, parentId: 0 },
  { id: 18, parentId: 16 },
  { id: 17, parentId: 16 },
  { id: 16, parentId: 0 },
  { id: 15, parentId: 17 },
  { id: 14, parentId: 19 },
  { id: 21, parentId: 19 },
  { id: 20, parentId: 18 },
]

输出样例:

{
  "id": 0,
  "children": [
    {
      "id": 19,
      "parentId": 0,
      "children": [
        {
          "id": 14,
          "parentId": 19
        },
        {
          "id": 21,
          "parentId": 19
        }
      ]
    },
    {
      "id": 16,
      "parentId": 0,
      "children": [
        {
          "id": 18,
          "parentId": 16,
          "children": [
            {
              "id": 20,
              "parentId": 18
            }
          ]
        },
        {
          "id": 17,
          "parentId": 16,
          "children": [
            {
              "id": 15,
              "parentId": 17
            }
          ]
        }
      ]
    }
  ]
}

求一份解答。

回复
1个回答
avatar
test
2024-07-14

这样?

js 代码

source.reduce((o, i) => {
  i = Object.assign(o[i.id] ??= {}, i);
  ((o[i.parentId] ??= {}).children ??= []).push(i);
  return o;
}, {0: {id: 0}})[0]

结果

{
  "id": 0,
  "children": [
    {
      "id": 19,
      "parentId": 0,
      "children": [
        {
          "id": 14,
          "parentId": 19
        },
        {
          "id": 21,
          "parentId": 19
        }
      ]
    },
    {
      "children": [
        {
          "id": 18,
          "parentId": 16,
          "children": [
            {
              "id": 20,
              "parentId": 18
            }
          ]
        },
        {
          "id": 17,
          "parentId": 16,
          "children": [
            {
              "id": 15,
              "parentId": 17
            }
          ]
        }
      ],
      "id": 16,
      "parentId": 0
    }
  ]
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容