一尘不染

如何将平面多分支数据转换为分层JSON?

algorithm

[
  {
    "id": "a",
    "pid": "a",
    "name": "AA",
  },
  {
    "id": "b",
    "pid": "a",
    "name": "BB",
  },
  {
    "id": "c",
    "pid": "a",
    "name": "CC",
  },
  {
    "id": "x",
    "pid": "b",
    "name": "XX",
  }
]

上面是我从数据库中获得的数据。每个人都有一个id和一个pidpid指向该人的较高级别的人id。如果一个人的水平最高,则id等于pid

我想将原始数据转换为分层JSON,如下所示:

[
  {
    "id": "a",
    "name": "AA",
    "child": [
      {
        "id": "b",
        "name": "BB"
        "child": [
          {
            "id": "x",
            "name": "XX"
          }
        ]
      },
      {
        "id": "c",
        "name": "CC"
      }
    ]  
  }
]

我正在使用Node.js。


阅读 221

收藏
2020-07-28

共1个答案

一尘不染

我建议您创建一棵树并将其id === pid作为树的根,这适用于未排序的数据。

这个怎么运作:

基本上,对于数组中的每个对象,都需要像id构建新对象一样使用来构建parentid新对象。

例如:

{ "id": 6, "pid": 4 }

它首先使用id以下命令生成此属性:

"6": {
    "id": 6,
    "pid": 4
}

然后用pid

"4": {
    "children": [
        {
            "id": 6,
            "pid": 4
        }
    ]
},

在对所有对象进行类似处理的同时,我们最终得到了一棵树。

如果为id === pid,则找到根节点。这是以后返回的对象。

var data = [

        { "id": "f", "pid": "b", "name": "F" },

        { "id": "e", "pid": "c", "name": "E" },

        { "id": "d", "pid": "c", "name": "D" },

        { "id": "c", "pid": "b", "name": "C" },

        { "id": "a", "pid": "a", "name": "A" },

        { "id": "b", "pid": "a", "name": "B" }

    ],

    tree = function (data) {

        var r, o = Object.create(null);

        data.forEach(function (a) {

            a.children = o[a.id] && o[a.id].children;

            o[a.id] = a;

            if (a.id === a.pid) {

                r = a;

            } else {

                o[a.pid] = o[a.pid] || {};

                o[a.pid].children = o[a.pid].children || [];

                o[a.pid].children.push(a);

            }

        });

        return r;

    }(data);



console.log(tree);
2020-07-28