我试图弄清楚如何递归地搜索此 JSON 对象中的节点。我尝试了一些但无法得到它:
var tree = {
"id": 1,
"label": "A",
"child": [
{
"id": 2,
"label": "B",
"child": [
{
"id": 5,
"label": "E",
"child": []
},
{
"id": 6,
"label": "F",
"child": []
},
{
"id": 7,
"label": "G",
"child": []
}
]
},
{
"id": 3,
"label": "C",
"child": []
},
{
"id": 4,
"label": "D",
"child": [
{
"id": 8,
"label": "H",
"child": []
},
{
"id": 9,
"label": "I",
"child": []
}
]
}
]
};
这是我的非工作解决方案,这可能是因为第一个节点只是一个值,而子节点在数组中:
function scan(id, tree) {
if(tree.id == id) {
return tree.label;
}
if(tree.child == 0) {
return
}
return scan(tree.child);
};
原文由 VladimirCoder84 发布,翻译遵循 CC BY-SA 4.0 许可协议
您的代码只是缺少一个循环来检查
child
数组中节点的每个子节点。此递归函数将返回节点的label
属性或undefined
如果树中不存在标签:您也可以使用不会导致堆栈溢出的显式堆栈迭代地执行此操作(但请注意,简写
stack.push(...curr.child);
可能由于扩展语法而溢出某些 JS 引擎的参数大小,因此请使用显式循环或concat
用于大量子数组):更通用的设计会返回节点本身,并让调用者访问
.label
属性(如果他们愿意),或者以其他方式使用该对象。请注意,JSON 纯粹是序列化(字符串化、原始)数据的字符串格式。一旦将 JSON 反序列化为 JavaScript 对象结构,就像这里一样,它就不再是 JSON。