我试图弄清楚如何在这个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);
};
型
3条答案
按热度按时间wztqucjr1#
您的代码只是缺少一个循环来检查
child
数组中节点的每个子节点。这个递归函数将返回节点的label
属性,如果树中没有标签,则返回undefined
:字符串
你也可以用一个显式的堆栈迭代地执行它,这不会导致堆栈溢出(但请注意,由于扩展语法,简写
stack.push(...curr.child);
可能会使一些JS引擎的参数大小溢出,所以对大规模的子数组使用显式循环):型
更通用的设计将返回节点本身,并允许调用者访问
.label
属性(如果需要),或以其他方式使用对象。请注意,JSON纯粹是序列化(字符串化,原始)数据的字符串格式。一旦将JSON反序列化为JavaScript对象结构(如此处所示),它就不再是JSON了。
o4tp2gmn2#
scan
可以使用第三个参数递归地写入,该参数对要扫描的节点队列进行建模字符串
因为JavaScript支持默认参数,所以
scan
的调用位置不变型
请在下面的浏览器中验证它是否有效
型
相关recursive search using higher-order functions
fnvucqvd3#
下面是使用object-scan的解决方案