You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并余额与汇率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);
}
关键细节解释
  1. 汇率映射的优势:用rateMap把分散的汇率对按基础货币归类,后续查找仅需O(1)时间,处理100+货币时效率远高于循环遍历。
  2. 拆分逻辑灵活调整:当前代码假设汇率对是3位基础货币开头,若你的API返回格式不同(比如USD-CNY),只需修改拆分逻辑(如split('-')[0])即可。
  3. 对象合并语法:用ES6扩展运算符...relatedRates简化合并操作,语法简洁且易维护。
  4. 表格适配:修改后的json2array_会自动收集所有出现过的汇率对作为表头,确保写入表格时所有数据列都能正确显示。
参考要点
  • Google Apps Script数组操作:forEach、map、filter等数组方法比传统for循环更简洁,适合处理大规模数据。
  • 类型转换:注意Balance和Equivilent可能是字符串类型,需用parseFloat转换为数值后再做过滤或小数处理。
  • 容错处理:代码中rateMap[baseCurrency] || {}的写法,确保即使某个货币无对应汇率,也不会报错,仅保留余额数据。

内容的提问来源于stack exchange,提问作者Trader Brader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:37:36