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

如何通过ID关联数组,将加密货币24h涨跌幅合并到新数组?

问题:合并加密货币涨跌幅数据到资产数组

现有数据结构

  • 加密货币24小时涨跌幅数组:
[{id:'bitcoin', change:-5.5}]
  • 加密货币基础信息数组:
[{
    id: 'bitcoin',
    symbol: 'BTC',
    name: 'Bitcoin',
    img: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Bitcoin.svg/1200px-Bitcoin.svg.png',
    addr: '0xECe365B379E1dD183B20fc5f022230C044d51404'
}]

当前已实现的代码

已通过循环调用getPrice接口获取实时价格,生成包含实时价格的transformedAssets数组:

for (let i = 0; i < this.assets.length; i++) {
    coinValue = await getPrice(this.assets[i].addr);
    this.transformedAssets.push({
        id: this.assets[i].id,
        symbol: this.assets[i].symbol,
        name: this.assets[i].name,
        img: this.assets[i].img,
        addr: this.assets[i].addr,
        value: numberWithCommas(coinValue)
    });
}

遇到的问题

尝试通过共同id将涨跌幅数据合并到transformedAssets时代码失效,原错误代码:

for (let i = 0; i < this.assets.length; i++) {
    coinValue = await getPrice(this.assets[i].addr);
    const price_change_percentage_24h = JSON.parse(JSON.stringify(this.coinPerfomance[0].change));
    window.console.log(price_change_percentage_24h);
    this.transformedAssets.push({
        id: this.assets[i].id,
        symbol: this.assets[i].symbol,
        name: this.assets[i].name,
        img: this.assets[i].img,
        addr: this.assets[i].addr,
        daychange: this.coinPerfomance[this.assets[i].id].change,
        value: numberWithCommas(coinValue)
    });
}

解决方案

错误核心是:coinPerfomance是数组而非对象,无法直接通过id作为键访问元素。以下是两种可行实现方式:

方法1:将涨跌幅数组转为映射对象(推荐,提升查找效率)

先把涨跌幅数组转换为以id为键的映射对象,后续循环直接通过id快速取值:

// 生成{id: change}格式的映射对象
const changeMap = this.coinPerfomance.reduce((map, item) => {
    map[item.id] = item.change;
    return map;
}, {});

// 循环生成带涨跌幅的资产数组
for (let i = 0; i < this.assets.length; i++) {
    const asset = this.assets[i];
    const coinValue = await getPrice(asset.addr);
    this.transformedAssets.push({
        ...asset, // 直接解构基础信息,简化代码
        value: numberWithCommas(coinValue),
        daychange: changeMap[asset.id] || 0 // 无对应数据时默认设为0,避免undefined
    });
}

方法2:循环内直接查找对应涨跌幅元素

若不想转换映射对象,可在每次循环中用find方法匹配对应id的涨跌幅数据:

for (let i = 0; i < this.assets.length; i++) {
    const asset = this.assets[i];
    const coinValue = await getPrice(asset.addr);
    // 查找当前资产对应的涨跌幅条目
    const perfItem = this.coinPerfomance.find(item => item.id === asset.id);
    this.transformedAssets.push({
        ...asset,
        value: numberWithCommas(coinValue),
        daychange: perfItem ? perfItem.change : 0 // 处理无匹配数据的情况
    });
}

关键说明

  • 原代码中this.coinPerfomance[this.assets[i].id]的写法错误,数组只能通过索引访问,不能直接用id作为键。
  • 映射对象方式的查找效率为O(1),比每次find的O(n)更适合数据量较大的场景。
  • 添加默认值0是为了避免部分资产无对应涨跌幅数据时,daychange出现undefined。

内容的提问来源于stack exchange,提问作者MAXWEL OCHIENG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:24:14