如何合并银行与用户账户两个API的嵌套数据并格式化输出
多API数据关联处理方案
需求梳理
- 现有2个API接口分别返回银行基础信息、用户账户信息
- 单个用户可在同一家银行开通多个账户,需将每条用户账户记录与对应银行的名称、logo等全量信息绑定,输出扁平的关联后结构,供前端组件直接使用
原始API返回数据示例
银行API返回格式
[ { "id": 2, "name": "KlikBCA", "bank_code": "KlikBCA", "country_code": "ID", "country_name": "India", "logo": "url", "createdAt": null, "updatedAt": "2021-07-26T14:58:03.000+00:00", "channels": null }, { "id": 7, "name": "BNI Internet Banking", "bank_code": "BNI Internet Banking", "country_code": "ID", "country_name": "Indis", "primary_color": "url", "logo": null, "createdAt": null, "updatedAt": "2021-07-26T14:58:03.000+00:00", "channels": null } ]
用户账户API返回格式
[ { "id": "sdf", "bankId": "7", "data": [ { "accountId": "1234", "accountHolder": "John Doe", "accountNumber": "587-2673-989", "balances": { "available": 500000 } }, { "accountId": "2345", "accountHolder": "John Doe", "accountNumber": "987-0675-789", "balances": { "available": 7500000 } } ] }, { "id": "f230", "bankId": "3", "data": [ { "accountId": "9876", "accountHolder": "Charls", "accountNumber": "765-6543-345", "balances": { "available": 200000 } } ] } ]
处理逻辑
- 先将银行接口返回的数组转换为以银行ID为键的映射对象,降低后续匹配查询的时间复杂度
- 遍历用户账户接口的每一条记录,将每条记录下的多账户数组拆分,单个账户生成一条独立的关联数据
- 通过每条用户记录的
bankId从银行映射对象中匹配对应银行信息,补充到账户记录的bank字段中 - 增加银行信息不存在的兜底逻辑,避免匹配不到数据时报错
代码实现(JavaScript)
// 入参:bankList为银行API返回数组,userList为用户账户API返回数组 function formatAccountData(bankList, userList) { // 生成银行ID映射表 const bankMap = new Map(bankList.map(bank => [bank.id, bank])) const result = [] userList.forEach(userBankRecord => { const bankId = Number(userBankRecord.bankId) const bankInfo = bankMap.get(bankId) || { // 匹配不到银行信息时的兜底默认值,可按需修改 name: '未知银行', logo: null } // 拆分多账户 userBankRecord.data.forEach(account => { result.push({ id: userBankRecord.id, bankId: userBankRecord.bankId, data: account, bank: bankInfo }) }) }) return result }
输出结果格式
[ { "id": "sdf", "bankId": "7", "data": { "accountId": "1234", "accountHolder": "John Doe", "accountNumber": "587-2673-989", "balances": { "available": 500000 } }, "bank":{ "id": 7, "name": "BNI Internet Banking", "bank_code": "BNI Internet Banking", "country_code": "ID", "country_name": "Indis", "primary_color": "url", "logo": null, "createdAt": null, "updatedAt": "2021-07-26T14:58:03.000+00:00", "channels": null } }, {"id": "sdf", "bankId": "7", "data": { "accountId": "2345", "accountHolder": "John Doe", "accountNumber": "987-0675-789", "balances": { "available": 7500000 } }, "bank":{ "id": 7, "name": "BNI Internet Banking", "bank_code": "BNI Internet Banking", "country_code": "ID", "country_name": "Indis", "primary_color": "url", "logo": null, "createdAt": null, "updatedAt": "2021-07-26T14:58:03.000+00:00", "channels": null } }, { "id": "f230", "bankId": "3", "data": { "accountId": "9876", "accountHolder": "Charls", "accountNumber": "765-6543-345", "balances": { "available": 200000 } }, "bank":{ "name": "未知银行", "logo": null } } ]
内容的提问来源于stack exchange,提问作者Rini Jaiswal
相关产品推荐
相关产品推荐

