如何通过其中的键将一个深度json转换为多个深度?

Posted

技术标签:

【中文标题】如何通过其中的键将一个深度json转换为多个深度?【英文标题】:How to convert one depth json to several depth by a key in it? 【发布时间】:2016-06-22 07:15:28 【问题描述】:

我从服务器得到一个 JSON 数组,但它的格式不正确,就像

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

当然,数组的第 2 项应该是第 1 项的子项,因为它的键为“parentId”,就像

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

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

【问题讨论】:

这就像将自引用 RDMS 数据库表转换为分层表。这并不简单,算法可能会根据数据量对性能产生影响 【参考方案1】:

此解决方案创建一棵树并将给定的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>');

【讨论】:

一开始我以为我可以从服务器获取根号,现在我发现我不能。你知道没有根号就可以工作吗? 我成功了,伙计,我太愚蠢了,没想到!我与服务器开发人员打交道一个根号,非常感谢 通常使用undefinednull 之类的值作为根的指示符。如果您喜欢 *** 上的答案,或者对您有所帮助,您可以投票或接受答案。请看这里:***.com/help/someone-answers 感谢您的提醒。您的代码确实有效,但是当我尝试阅读它时,我感到困惑,我无法完全理解它。你能在代码中添加一些注释吗? 我明白了!你帮了我很多忙!

以上是关于如何通过其中的键将一个深度json转换为多个深度?的主要内容,如果未能解决你的问题,请参考以下文章

JS中实现深度拷贝,复制一个对象

如何使用包含连字符的键将对象解构为变量? [复制]

深度学习数据txt转json

如何重命名字典列表中深度嵌套的键(Python 3)?

pig 新手,如何使用 pig 中的键值对子集将 JSON 转换为另一个 JSON?

深度解析PHP数组函数array_combine