是否有一种使用DFS遍历树的方法,其中树不是所有子对象都预定义的,而是基于服务器响应的。例如,假设我有一棵树:
tree = ['a','b','c']; 在上述情况下,我不知道这些节点是否有任何子节点,我不知道何时调用服务器。 所以现在我取树的第一个节点,即“ a”,并将其传递给URL:
"https://test.com/'a'
并获得节点'a'的子节点的响应。
o / p:'a'= ['1','2','3'];
然后我取'a'的第一个节点,即'1',(例如tree ['a'] ['1'])
并将其传递给相同的网址,例如"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]));
})
}
});
}
任何线索都知道这种方法是如何工作的? 谢谢
答案 0 :(得分:1)
创建一个异步递归函数来填充树。您的函数已经具有所需的大部分部分。两个缺少的部分是每个递归的父节点和每个递归应从中获取数据的url。
假设一个虚构的1994
函数将一个节点添加到树中:
df %>%
filter(year <= 1994) %>%
arrange(desc(actions)) %>%
mutate(year = 1994,
rank = row_number())
# id actions year rank
#1 f 109 1994 1
当使用根节点和基本URL调用时,该函数将开始遍历API并在收到响应时构建树。
您可以具有一个附加的depth参数,并控制每次递归进行的深度。如果要在用户单击每个节点时加载树,这可能会很有用。
答案 1 :(得分:0)
您从API获取数据,所以主要问题是异步数据句柄。使用async function会更容易。
考虑一棵树
a b c
|
1------------2
| |
11,12,13 21,22,23
使用async/await
/**
* simulate fetch which returns a promise
*/
async function fetch(url) {
const node = url.replace('https://test.com/', '');
switch (node) {
case 'a':
return [1, 2];
case '1':
return [11, 12, 13];
case '2':
return [21, 22, 23];
default:
return null;
}
}
/**
* getNode will also return a promise
*/
async function getNode(node) {
console.log('node:', node);
const data = await fetch(`https://test.com/${node}`);
if (Array.isArray(data)) {
for (let i = 0; i < data.length; i++) {
await getNode(data[i]);
}
}
}
getNode('a');
输出
node: a
node: 1
node: 11
node: 12
node: 13
node: 2
node: 21
node: 22
node: 23