我有以下 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/