首页 > 解决方案 > 循环遍历 json 树对象并创建新数组

问题描述

有没有一种好方法 JS/ES6 来循环一个对象及其子对象并创建新的对象树数组。

我有这个 json 树对象:

[
{
    id: "001",
    deparmentsIds: [
        "002",
        "003"
    ],
    details: {
        parentDeparmentsId: null,
        name: "Top"
    }
},
{
    id: "002",
    deparmentsIds:[
        "004"
    ],
    details: {
        parentDeparmentsId: ["001"],
        name: "Operations"
    }
},
{
    id: "003",
    deparmentsIds:[]
    details: {
        parentDeparmentsId: ["001"],
        name: "Support"
    }
},
{
    id: "004",
    deparmentsIds:[]
    details: {
        parentDeparmentsId: ["002"],
        name: "Support operations"
    }
}

]

我想创建如下所示的新对象数组树: 在此处输入图像描述

标签: javascriptloopsecmascript-6

解决方案


reduce您可以使用和方法创建递归函数map来创建嵌套对象结构。

const data = [{"id":"001","deparmentsIds":["002","003"],"details":{"parentDeparmentsId":null,"name":"Top"}},{"id":"002","deparmentsIds":["004"],"details":{"parentDeparmentsId":"001","name":"Operations"}},{"id":"003","deparmentsIds":[],"details":{"parentDeparmentsId":"001","name":"Support"}},{"id":"004","deparmentsIds":[],"details":{"parentDeparmentsId":"002","name":"Support operations"}}]

function tree(input, parentId) {
  return input.reduce((r, e) => {
    if (e.id == parentId || parentId == undefined && e.details.parentDeparmentsId == null) {
      const children = [].concat(...e.deparmentsIds.map(id => tree(input, id)))
      const obj = {
        [e.details.name]: children
      }
      r.push(obj)
    }
    return r;
  }, [])
}

const result = tree(data)
console.log(result)


推荐阅读