为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

aluckdog 2022-10-13 15:45:41
我试图找出使 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 级都可以使用的方法。什么是好方法?希望这有意义吗?
查看完整描述

3 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

我想我会尝试通过递归来解决这个问题,只需将每个返回的 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);


查看完整回答
反对 回复 2022-10-13
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

使用先进先出 (FIFO) 队列和 while 循环。找到所有者后立即跳出 while 循环type: 'person'。FIFO 队列很容易使用数组实现,并使用该.shift()方法获取行中的第一个元素.append()并将元素添加到行尾。


这是一些基本代码。


let queue = [companyA];


const foundPerson = false;

const person = null;

while(queue.length > 0 && !foundPerson) {

  const company = queue.shift(); // get the first company in line

  const owners = await lookupOwners(company);

  for(let i = 0; i < owners.length; i++) {

    if(owners[i].type === "person") {

      foundPerson = true;

      person = owners[i];

|   }

    else {

      // if it's not a person, add the company ID to the end of the FIFO queue

      queue.append(owners[i].cin);

    }

  }

}


查看完整回答
反对 回复 2022-10-13
?
慕神8447489

TA贡献1780条经验 获得超1个赞

由于任何一家公司都可以有多个所有者这一事实,您的可能性变得复杂......并且您不能保证您可以拥有人和公司所有者的混合......以下应该完全返回一组所有人的所有者水平


var companyID = 1234;

var peopleOwnerList = [];

var companyOwnerList = [];

companyOwnerList.push(companyID);

do {

  const requestResult = await lookupOwners(companyOwnerList[0]);

  var ownerList = requestResult.owners;

  while(ownerList.length > 0){

    if(ownerList[0].type == 'person'){

      peopleOwnerList.push(ownerList[0].name);

    }

    else {

      companyOwnerList.push(ownerList[0].cin);

    }

    ownerList.splice(0,1);

  }

  companyOwnerList.splice(0,1);

}

while(companyOwnerList.length > 0);


查看完整回答
反对 回复 2022-10-13
  • 3 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信