如何通过其中的键将一个深度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>');
【讨论】:
一开始我以为我可以从服务器获取根号,现在我发现我不能。你知道没有根号就可以工作吗? 我成功了,伙计,我太愚蠢了,没想到!我与服务器开发人员打交道一个根号,非常感谢 通常使用undefined
或null
之类的值作为根的指示符。如果您喜欢 *** 上的答案,或者对您有所帮助,您可以投票或接受答案。请看这里:***.com/help/someone-answers
感谢您的提醒。您的代码确实有效,但是当我尝试阅读它时,我感到困惑,我无法完全理解它。你能在代码中添加一些注释吗?
我明白了!你帮了我很多忙!以上是关于如何通过其中的键将一个深度json转换为多个深度?的主要内容,如果未能解决你的问题,请参考以下文章