我尝试返回JSON对象结构中的特定节点,如下所示
{
"id":"0",
"children":[
{
"id":"1",
"children":[...]
},
{
"id":"2",
"children":[...]
}
]
}
所以它是一个树状的父子关系,每个 * 节点 * 都有一个唯一的ID,我正在尝试找到一个特定的 * 节点 *,就像这样
function findNode(id, currentNode) {
if (id == currentNode.id) {
return currentNode;
} else {
currentNode.children.forEach(function (currentChild) {
findNode(id, currentChild);
});
}
}
我执行了搜索,例如findNode("10", rootNode)
。但是即使搜索找到了匹配,函数也总是返回undefined
。我有一种不好的感觉,递归函数在找到匹配后没有停止,而是继续运行,最终返回undefined
,因为在后面的递归执行中,它没有到达返回点,但是我不知道如何修复这个问题。
救命啊!
8条答案
按热度按时间jchrr9hc1#
当递归搜索时,你必须通过返回来传递回结果,但是你不会返回
findNode(id, currentChild)
的结果。wqsoz72f2#
这个方法将返回节点列表中的节点,但是这将遍历节点的所有子节点,因为我们不能成功地断开
forEach
流。一个更好的实现如下所示。kuarbcqp3#
我使用以下代码
然后你可以写
现在,这个函数适用于循环引用,您可以通过修改
matchCallback
函数来匹配任何字段或字段组合。yruzcnhs4#
既然这个老问题又被提了回来,这里有一个不同的方法。我们可以编写一个相当通用的
searchTree
函数,然后在findId
函数中使用它。searchTree
完成遍历对象的工作;它接受回调以及树;回调函数确定节点是否匹配。除了节点,回调函数还提供了两个函数,next
和found
,我们调用这两个函数时不带任何参数,分别表示我们应该继续或者我们已经找到匹配。如果没有找到匹配,我们返回null
。它看起来像这样:
这段代码是特定于
children
属性下的数组中的子节点的结构,虽然我们可以根据需要使其更通用,但我发现这是一个需要支持的常见结构。有一个很好的论点是,这将是更好地编写与相互递归。如果我们想,我们可以得到相同的API与此版本:
这是同样的工作方式。但我发现代码更干净。不过,两者都应该完成这项工作。
bvpmtnay5#
我们使用object-scan来满足我们的数据处理需求。它在概念上非常简单,但允许使用很多很酷的东西。
bis0qfac6#
我真的很喜欢树搜索!对于今天大多数复杂的结构化任务来说,树是一种非常常见的数据结构。所以我午餐也有类似的任务。我甚至做了一些深入的研究,但实际上没有发现任何新的东西!所以今天我为你准备的是“我是如何用现代JS语法实现它的”:
bwitn5fc7#
递归结构搜索、修改、键/值调整/替换。
用法示例:
提示和提示:
你可以把它作为一个搜索回调函数,不返回任何东西(不会影响任何东西),然后选择你需要的值到你的数组/集合/Map中。
注意回调在每个leaf/value/key(不仅仅是对象)上运行。
或者你可以使用回调函数来调整特定的值,甚至改变键。它还可以自动检测循环,并提供一个标志,让你决定如何处理它们。
密码
(uses ES6)
函数本身+一些示例演示数据
x一个一个一个一个x一个一个二个一个x一个一个三个一个
u59ebvdq8#
类似的问题已经回答过好几次了,但我只想添加一个包含嵌套数组的通用方法
我希望这能帮到一些人