如何合并余额与汇率JSON数组?求实现思路及示例代码
实现思路
核心是先对汇率数据做预映射优化,避免多次循环查找,再逐个合并余额与对应汇率:
- 第一步:解析汇率数组,把每个汇率对(比如
USDCNY)拆分为基础货币(USD)和目标后缀(CNY),构建一个以基础货币为key的对象,value是该货币对应的所有汇率键值对(比如{USDCNY: 0.12, USDJPY: 0.75})。 - 第二步:遍历余额数组,对每个余额对象,从预构建的汇率映射中取出对应数据,合并到余额对象里,得到最终结构。
- 额外处理:保留你现有代码中过滤0余额的逻辑,同时处理汇率对拆分的边界情况(确保所有汇率对都是「基础货币+目标货币」的格式)。
示例代码(适配你的Google Apps Script环境)
我基于你现有的函数新增了合并逻辑,同时调整部分细节让流程更顺畅:
// 新增:合并余额和汇率的核心函数 function mergeBalancesAndRates() { // 获取原始数据 const balances = getbalances(); // 返回[{Currency: 'USD', Balance: 3.25}, ...] const ratePairs = getValues(); // 返回[{Currency: 'USDCNY', Equivilent: 0.12}, ...] // 第一步:构建汇率映射,key是基础货币,value是该货币的所有汇率键值对 const rateMap = {}; ratePairs.forEach(pair => { const pairSymbol = pair.Currency; // 拆分基础货币:假设所有汇率对都是3位基础货币+目标货币格式(如USDCNY) // 若API格式不同(如USD/CNY),可改为split('/')[0],按需调整 const baseCurrency = pairSymbol.substring(0, 3); const rateKey = pairSymbol; const rateValue = pair.Equivilent; // 初始化基础货币对应的汇率对象 if (!rateMap[baseCurrency]) { rateMap[baseCurrency] = {}; } // 添加当前汇率对 rateMap[baseCurrency][rateKey] = rateValue; }); // 第二步:合并余额和汇率 const mergedResult = balances .filter(balance => parseFloat(balance.Balance) !== 0) // 过滤0余额 .map(balance => { const baseCurrency = balance.Currency; // 取出当前货币对应的汇率(无对应汇率则取空对象) const relatedRates = rateMap[baseCurrency] || {}; // 合并对象,保留原始余额信息并加入汇率 return { Currency: baseCurrency, Balance: parseFloat(balance.Balance).toFixed(2), // 可选:保留两位小数 ...relatedRates // 展开所有汇率键值对 }; }); Logger.log(mergedResult); return mergedResult; } // 调整后的json2array_:适配合并后的多列数据 function json2array_(data){ if (data.length === 0) return []; // 收集所有表头:固定列(Currency、Balance)+ 所有汇率对列 const allKeys = ['Currency', 'Balance']; data.forEach(item => { Object.keys(item).forEach(key => { if (!allKeys.includes(key) && key !== 'Currency' && key !== 'Balance') { allKeys.push(key); } }); }); // 构建二维表格数组 const results = [allKeys]; data.forEach(item => { const row = allKeys.map(key => item[key] || ''); // 无对应值则填空 results.push(row); }); return results; } // 示例:调用合并函数并写入表格 function loadMergedData() { const balancesSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Balances"); balancesSheet.getRange(1,1,150,10).clearContent(); // 扩大范围容纳汇率列 const mergedData = mergeBalancesAndRates(); const arr = json2array_(mergedData); const destinationRange = balancesSheet.getRange(1,1,arr.length,arr[0].length); destinationRange.setValues(arr); }
关键细节解释
- 汇率映射的优势:用
rateMap把分散的汇率对按基础货币归类,后续查找仅需O(1)时间,处理100+货币时效率远高于循环遍历。 - 拆分逻辑灵活调整:当前代码假设汇率对是3位基础货币开头,若你的API返回格式不同(比如
USD-CNY),只需修改拆分逻辑(如split('-')[0])即可。 - 对象合并语法:用ES6扩展运算符
...relatedRates简化合并操作,语法简洁且易维护。 - 表格适配:修改后的
json2array_会自动收集所有出现过的汇率对作为表头,确保写入表格时所有数据列都能正确显示。
参考要点
- Google Apps Script数组操作:
forEach、map、filter等数组方法比传统for循环更简洁,适合处理大规模数据。 - 类型转换:注意
Balance和Equivilent可能是字符串类型,需用parseFloat转换为数值后再做过滤或小数处理。 - 容错处理:代码中
rateMap[baseCurrency] || {}的写法,确保即使某个货币无对应汇率,也不会报错,仅保留余额数据。
内容的提问来源于stack exchange,提问作者Trader Brader
相关产品推荐
相关产品推荐

