如何循环 API 调用层次结构直到条件为真?
How to loop API calls for hierarchy until a condtion is true?
我正在尝试找出使 API 调用循环直到满足条件(或者如果有更好的解决方案。)的“最佳”方法。
API 将为我提供有关一家公司的 ultimateBeneficialOwners 的数据。
一个公司可以有多个所有者,类型可以是:corp 或 person。
我的目标是为每个找到的所有者收集所有信息,直到找到 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 returns john 和 Anna 作为所有者:
{
owners: [
{
name: 'john',
type: 'person',
},
{
name: 'anna',
type: 'person'
]
}
所以总结一下:如果所有者是 type: corp
,我想为每个公司提出一个新的 api 请求,直到响应包含一个准确的人。那么我们就完成了!
我正在寻找一种无论初始公司拥有 10 级所有者还是 0 级所有者都有效的方法。
什么是好的方法?
希望这有意义吗?
问候
卡斯帕
使用先进先出 (FIFO) 队列和 while 循环。一旦找到 while type: 'person'
的所有者,就立即跳出 while 循环。使用数组并使用 .shift()
方法获取行中的第一个元素并使用 .append()
将元素添加到行尾可以轻松实现 FIFO 队列。
这是一些基本代码。
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);
}
}
}
你的可能性很复杂,因为任何一家公司都可以有多个所有者......而且你不能保证你可以拥有人员和公司所有者的组合......以下应该 return 各级所有人的数组
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);
我想我会尝试通过递归来解决这个问题,只需将每个返回的 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);
我正在尝试找出使 API 调用循环直到满足条件(或者如果有更好的解决方案。)的“最佳”方法。
API 将为我提供有关一家公司的 ultimateBeneficialOwners 的数据。 一个公司可以有多个所有者,类型可以是:corp 或 person。
我的目标是为每个找到的所有者收集所有信息,直到找到 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 returns john 和 Anna 作为所有者:
{
owners: [
{
name: 'john',
type: 'person',
},
{
name: 'anna',
type: 'person'
]
}
所以总结一下:如果所有者是 type: corp
,我想为每个公司提出一个新的 api 请求,直到响应包含一个准确的人。那么我们就完成了!
我正在寻找一种无论初始公司拥有 10 级所有者还是 0 级所有者都有效的方法。
什么是好的方法?
希望这有意义吗?
问候 卡斯帕
使用先进先出 (FIFO) 队列和 while 循环。一旦找到 while type: 'person'
的所有者,就立即跳出 while 循环。使用数组并使用 .shift()
方法获取行中的第一个元素并使用 .append()
将元素添加到行尾可以轻松实现 FIFO 队列。
这是一些基本代码。
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);
}
}
}
你的可能性很复杂,因为任何一家公司都可以有多个所有者......而且你不能保证你可以拥有人员和公司所有者的组合......以下应该 return 各级所有人的数组
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);
我想我会尝试通过递归来解决这个问题,只需将每个返回的 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);