json 使用async遍历javascipt数组的所有可能路径

0md85ypi  于 2022-12-24  发布在  Java
关注(0)|答案(2)|浏览(109)

我是一个Javascript的乞丐,我目前正在尝试寻找从axios GET请求返回的JSON对象的所有可能路径。每个项目可以属于一个或多个组,一个组可以属于另一个组。

{
  "name": "item1",
  "groupNames": [ "GROUPA" ]
}

{
    "name": "GROUPA",
    "groupNames": [
        "GROUPB"
    ]

}
....
{
    name: "GROUPZ"
    "groupNames": [
      
    ]
}

我的问题是我的代码只有在数组中一个项目名称只有一个父groupName的情况下才有效。如果我们有多个父groupName呢?例如

{
  "name": "item1",
  "groupNames": [ "GROUPA","GROUC",GROUBD ]
}
...

我的当前代码:

let parent = 'item1';
 do{ 
   let endpoint = ${process.env.OPENHAB_HOST}:${process.env.OPENHAB_PORT}/rest/items/${parent}?recursive=false 
    result = await getAxiosRequest(endpoint,{},res); // get request to specific endpoint
    parent = result.data.groupNames; }
while(result.data.groupNames.length !== 0 )
vsdwdz23

vsdwdz231#

若要查找具有多个父组的项的所有父组,可以按如下所示修改代码:
初始化一个名为parents的数组来存储您找到的父组。在循环中,不要将parent赋值给result.data.groupNames,而是遍历result.data.groupNames并将每个组添加到parents数组中。循环结束后,parents将包含给定项的所有父组。修改后的代码如下所示:

let parent = 'item1';
let parents = []; // initialize array to store parent groups

do { 
  let endpoint = `${process.env.OPENHAB_HOST}:${process.env.OPENHAB_PORT}/rest/items/${parent}?recursive=false`;
  result = await getAxiosRequest(endpoint,{},res); // get request to specific endpoint
  result.data.groupNames.forEach(group => parents.push(group)); // add each group to the parents array
  parent = result.data.groupNames;
} while(result.data.groupNames.length !== 0);

console.log(parents); // array of parent groups

即使项具有多个父组,此操作也应该起作用。

bfrts1fy

bfrts1fy2#

循环运行后的最终结果应该是什么并不完全清楚,但我假设您可能会从数组中的给定项 * 收集 * 路径。
因为您确实可以获得多个组,所以您需要将它们存储在队列/堆栈中以供以后处理,或者使用递归(出于同样的原因)。
下面是使用递归时的情况:

function async visit(parent) {
  const endpoint = `${process.env.OPENHAB_HOST}:${process.env.OPENHAB_PORT}/rest/items/${parent}?recursive=false`;
  const {data} = await getAxiosRequest(endpoint, {}, res);
  const results = [];
  for (const group of data.groupNames) {
    results.push(...(await visit(group)).map(path => path.concat(group)));
  }
  return results;
}

visit('item1').then(paths => {
    // ....
});

相关问题