有没有一种方法可以使用 DFS 遍历树,其中树不是预定义其所有子节点,而是基于服务器响应。例如,假设我有一棵树:
树 = ['a','b','c']; 在上面的情况下,我不知道这些节点是否有任何子节点,当我调用服务器时我就会知道。 所以现在我获取树的第一个节点,即“a”并将其传递给网址:
“https://test.com/'a'
并获取节点 'a' 的子节点的响应。
o/p: 'a'= ['1','2','3'];
然后我取'a'的第一个节点,即:'1',(类似于tree['a']['1'])
并将其传递到相同的 url,例如 "https://test.com/'1'
并获取节点 '1' 的所有子节点的响应。
我想说的是,除非我调用 api,否则我不知道一个节点有多少个子节点。因此我这里的代码进入了一些无限循环。而且它不执行 DFS,而是执行 BFS。
function getNode(arr) {
fetch("https://test.com/'a'", function(data){
if (Array.isArray(data)) {
data.forEach(function(node,i){
var promises = resolve(self.getNode(arr[i]));
})
}
});
}
知道这种方法是如何运作的吗? 谢谢
最佳答案
创建一个异步递归函数来填充树。您的函数已经具备了大部分所需的部分。两个缺失的部分是每个递归的父节点和每个递归应从中获取数据的 url。
假设一个虚构的 addNode(aParent, aNode)
函数将一个节点添加到树中:
function getNode(parentNode, url) {
//Get remote data from this url
fetch(url, function(data){
if (Array.isArray(data)) {
//Go through each node it returns
data.forEach(function(childNode){
//Add to the specified parent
addNode(parentNode, childNode);
//Construct the new url and
//call the same function with each received child as a parent
getNode(url + '/' + childNode, childNode);
})
}
});
}
当使用根节点和基本 url 调用时,该函数将开始遍历 API 并在收到响应时构建树。
您可以有一个额外的深度参数并控制每次递归的深度。如果您想在用户单击每个节点时加载树,这可能很有用。
关于javascript - 如何基于 api 调用遍历树/数组 -Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55273985/