如何循环 API 调用以获取层次结构,直到条件为真?

我试图找出使 API 调用循环的“最佳”方法,直到满足条件(或者如果有更好的解决方案。)


API 将为我提供有关公司的最终BeneficialOwners 的数据。一家公司可以有多个所有者,其类型可以是:公司或个人。


我的目标是收集每个找到的所有者的所有信息,直到我找到属于type:person. 然后我知道我找到了最高级别的所有者。


假设我要求 A 公司的所有所有者。


const requestResult = await lookupOwners(cinForCompanyA);

A 公司归 B 公司所有,因此响应如下所示:


{

 owners: [

  {

   title: 'Company B',

   type: 'corp',

   cin: 1234,

  }

 ]

}

我存储该数据,现在我想为 CompanyB 请求数据


const requestResult = await lookupOwners(1234);

并继续这个过程,直到响应对象有type: 'person'. 因此,假设 B 公司的查找返回 john 和 Anna 作为所有者:


{

 owners: [

  {

   name: 'john',

   type: 'person',

  },

  {

   name: 'anna',

   type: 'person'

 ]

}

总结一下:如果所有者是type: corp我想为每个公司提出一个新的 api 请求,直到响应包含一个准确的人。然后我们就完成了!


我正在寻找一种无论初始公司是否有 10 级所有者或 0 级都可以使用的方法。


什么是好方法?


希望这有意义吗?


aluckdog
浏览 92回答 3
3回答

茅侃侃

我想我会尝试通过递归来解决这个问题,只需将每个返回的 cin 放回函数中,直到找到一个人。您还可以添加检查,具体取决于每个公司是否终止于一个人,或者您是否在某个时候获得空值或您拥有什么,这取决于您查询的 api 的具体情况。async function lookup(cin) {  try {    const company = await lookupOwners(cin);    if (company.owners.find((o) => o.type === "person")) {      return company;    } else {      return lookup(company?.owners[0].cin);    }  } catch (e) {    return e;  }}lookup(cin);

慕哥6287543

使用先进先出 (FIFO) 队列和 while 循环。找到所有者后立即跳出 while 循环type: 'person'。FIFO 队列很容易使用数组实现,并使用该.shift()方法获取行中的第一个元素.append()并将元素添加到行尾。这是一些基本代码。let queue = [companyA];const foundPerson = false;const person = null;while(queue.length > 0 && !foundPerson) {&nbsp; const company = queue.shift(); // get the first company in line&nbsp; const owners = await lookupOwners(company);&nbsp; for(let i = 0; i < owners.length; i++) {&nbsp; &nbsp; if(owners[i].type === "person") {&nbsp; &nbsp; &nbsp; foundPerson = true;&nbsp; &nbsp; &nbsp; person = owners[i];|&nbsp; &nbsp;}&nbsp; &nbsp; else {&nbsp; &nbsp; &nbsp; // if it's not a person, add the company ID to the end of the FIFO queue&nbsp; &nbsp; &nbsp; queue.append(owners[i].cin);&nbsp; &nbsp; }&nbsp; }}

慕神8447489

由于任何一家公司都可以有多个所有者这一事实,您的可能性变得复杂......并且您不能保证您可以拥有人和公司所有者的混合......以下应该完全返回一组所有人的所有者水平var companyID = 1234;var peopleOwnerList = [];var companyOwnerList = [];companyOwnerList.push(companyID);do {&nbsp; const requestResult = await lookupOwners(companyOwnerList[0]);&nbsp; var ownerList = requestResult.owners;&nbsp; while(ownerList.length > 0){&nbsp; &nbsp; if(ownerList[0].type == 'person'){&nbsp; &nbsp; &nbsp; peopleOwnerList.push(ownerList[0].name);&nbsp; &nbsp; }&nbsp; &nbsp; else {&nbsp; &nbsp; &nbsp; companyOwnerList.push(ownerList[0].cin);&nbsp; &nbsp; }&nbsp; &nbsp; ownerList.splice(0,1);&nbsp; }&nbsp; companyOwnerList.splice(0,1);}while(companyOwnerList.length > 0);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript