如何通过一个键将一个深度json转换为几个深度?

时间:2016-03-08 11:09:15

标签: javascript arrays json algorithm frontend

我从服务器获得了一个JSON数组,但它不正确,如

 [
    {
      "id": 2,
      "parentId": 1,
    },
    {
      "id": 3,
      "parentId": 2,
    }
   ]

当然,数组的第二项应该是第一项的子项,因为它的键为“parentId”,如

 [
    {
        "id": 2,
        "parentId": 1,
        "children": [
            {
                "id": 3,
                "parentId": 2,
            }
        ]
    }
 ]

如何将第一种形式的JSON转换为第二种?

1 个答案:

答案 0 :(得分:3)

此解决方案创建一个树,并将给定的parentId作为树的根。

工作原理:

  

基本上,对于数组中的每个对象,构建新对象的id以及同一对象的parentId都需要。

实施例

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

首先使用id

生成
 "6": {
    "id": 6,
    "parentId": 4
}

然后这个结构带有parentId

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

虽然所有对象都是这样对待的,但我们最终得到了一棵树。

如果找到parentId === root根节点。这是后来回归的对象。



var data = [{ "id": 1, "parentId": 0 }, { "id": 6, "parentId": 4 }, { "id": 4, "parentId": 1 }],
    tree = function (data, root) {
        var r, o = {};
        data.forEach(function (a) {
            a.children = o[a.id] && o[a.id].children;
            o[a.id] = a;
            if (a.parentId === root) {
                r = a;
            } else {
                o[a.parentId] = o[a.parentId] || {};
                o[a.parentId].children = o[a.parentId].children || [];
                o[a.parentId].children.push(a);
            }
        });
        return r;
    }(data, 0);
    
document.write('<pre>' + JSON.stringify(tree, 0, 4) + '</pre>');
&#13;
&#13;
&#13;