javascript - 从 JSON 设置父子关系

标签 javascript json algorithm loops formatting

我有以下 JSON 数据:

[
 {id: 1, indent: '1'},
 {id: 2, indent: '1.1'},
 {id: 3, indent: '1.2'},
 {id: 4, indent: '2'},
 {id: 5, indent: '2.1'},
 {id: 6, indent: '2.2'},
 {id: 7, indent: '2.2.1'},
 {id: 8, indent: '1.2.1'},
 {id: 9, indent: '3'},
]

我想将其转换为如下所示:

[
 {id: 1, indent: '1', parent: null},
 {id: 2, indent: '1.1', parent: 1},
 {id: 3, indent: '1.2', parent: 1},
 {id: 4, indent: '2', parent: null},
 {id: 5, indent: '2.1', parent: 4},
 {id: 6, indent: '2.2', parent: 4},
 {id: 7, indent: '2.2.1', parent: 6},
 {id: 8, indent: '1.2.1', parent: 3},
 {id: 9, indent: '3', parent: null},
]

我可以通过 2 个 for 循环(外部和内部)来实现此目的,但我正在寻找一些有效的方法来做到这一点。

ex: 
forloop each node
   get indent and check if dots ('.') are more than one
     if true
     for-loop the array and check for indent that start with the indent and ends with dot + 1

最佳答案

除非你的 json 中有超过 100000 个这样的项目(这似乎不太可能,因为下载/发送需要很长时间),那么你的方法就可以正常工作。

您可以做的最佳优化是利用 id 有序的事实。由于引用不是,这将要求您在前进时跟踪 id 以缩进对象中的引用。

看起来像这样

var jsonObj = [
 {id: 1, indent: '1'},
 {id: 2, indent: '1.1'},
 {id: 3, indent: '1.2'},
 {id: 4, indent: '2'},
 {id: 5, indent: '2.1'},
 {id: 6, indent: '2.2'},
 {id: 7, indent: '2.2.1'},
 {id: 8, indent: '1.2.1'},
 {id: 9, indent: '3'},
];
 
var parentIds = {};  
for(var i = 0; i < jsonObj.length; i++){
 var obj = jsonObj[i];
 var dot = obj.indent.lastIndexOf('.');
 if(dot > -1){
  obj.parent = parentIds[obj.indent.substr(0,dot)];  
 }else{
  obj.parent = null;
 }
 parentIds[obj.indent] = obj.id;
}

console.log(jsonObj);
document.querySelector("#d").innerHTML = JSON.stringify(jsonObj);
<div id="d"></div>

关于javascript - 从 JSON 设置父子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30603707/

相关文章:

javascript - 防止后退按钮漏洞利用? PHP

javascript - 错误: Can't set headers after they are sent when return jwt.验证

algorithm - 为图形着色,使每个节点都着色或与着色节点相邻

javascript - 基于最长宽度字符串的 CSS/HTML 居中段落内容

javascript - 如何使用 angularjs 遍历 JSON 对象

javascript - 在 Node 中解析 JSON API

php - 在 cordova 中使用 php 和 mysql

选择具有最高点数但具有给定成本的玩家的算法

algorithm - 城市 build 策略算法

javascript - 自动滚动(启用 css overflow-y)效果的小谜题