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

如何遍历数组提取Market ID?优化JSON数据输出代码

问题

我正尝试从JSON中提取所有marketId,目前使用forEach循环获取每个eventId及其markets数组中的全部数据,现有代码如下:

export async function generateData() {
  const matchArray = [];
  try {
    const data = await get(dataEndpoint);
    data ? data.forEach((item) => {
      if (item.type== 'MATCH'){
      matchArray.push({ eventId: item.id, markets: [item.markets]});
      } 
    }) : console.log(`No data received ${data}`);
    await writeJSON(matchFilePath, matchArray);
  } catch (error) {
    throw error;
  }        
}

当前代码输出的JSON文件内容如下:

[
  {
    "eventId": "b312bea8-c25b-43f2-85a3-1c6caa5230e4",
    "markets": [
      [
        {
          "id": "28e53502-8a44-467e-a5bc-d1d613597d26",
          "createdAt": "2024-08-05T10:31:58.288Z"
        },
        {
          "id": "28e53502-8a44-467e-a5bc-d1d613597d25",
          "createdAt": "2024-08-05T10:31:58.288Z"
        },
        {
          "id": "28e53502-8a44-467e-a5bc-d1d613597d21",
          "createdAt": "2024-08-05T10:31:58.288Z"
        }
      ]
    ]
  },
  {
    "eventId": "b312bea8-c25b-43f2-85a3-1c6caa5230e4",
    "markets": [
      [
        {
          "id": "28e53502-8a44-467e-a5bc-d1d613597d16",
          "createdAt": "2024-08-05T10:31:58.288Z"
        },
        {
          "id": "28e53502-8a44-467e-a5bc-d1d613597d15",
          "createdAt": "2024-08-05T10:31:58.288Z"
        },
        {
          "id": "28e53502-8a44-467e-a5bc-d1d613597121",
          "createdAt": "2024-08-05T10:31:58.288Z"
        }
      ]
    ]
  }
]

但我理想的输出是仅保留每个event对应的markets数组中的id字段,期望输出示例如下:

[
  {
    "eventId": "b312bea8-c25b-43f2-85a3-1c6caa5230e4",
    "markets": [
      [
        {
          "id": "28e53502-8a44-467e-a5bc-d1d613597d26",
        },
        {
          "id": "28e53502-8a44-467e-a5bc-d1d613597d25",
        },
        {
          "id": "28e53502-8a44-467e-a5bc-d1d613597d21",
        }
      ]
    ]
  },
  {
    "eventId": "b312bea8-c25b-43f2-85a3-1c6caa5230e4",
    "markets": [
      [
        {
          "id": "28e53502-8a44-467e-a5bc-d1d613597d16",
        },
        {
          "id": "28e53502-8a44-467e-a5bc-d1d613597d15",
        },
        {
          "id": "28e53502-8a44-467e-a5bc-d1d613597121",
        }
      ]
    ]
  }
]

我不知道如何仅提取markets数组中的market id,想了解具体实现方法。

解决方案

你需要对item.markets做映射处理,只保留每个market对象里的id字段。另外注意你当前代码里markets: [item.markets]会给原markets数组多套一层数组,按照你给出的期望输出,这层嵌套需要保留。

修改后的代码如下:

export async function generateData() {
  const matchArray = [];
  try {
    const data = await get(dataEndpoint);
    if (data) {
      data.forEach((item) => {
        if (item.type === 'MATCH') {
          // 遍历markets数组,只保留每个元素的id字段
          const filteredMarkets = item.markets.map(market => ({ id: market.id }));
          matchArray.push({ 
            eventId: item.id, 
            markets: [filteredMarkets] // 保持原有的双层数组结构
          });
        } 
      });
    } else {
      console.log(`No data received ${data}`);
    }
    await writeJSON(matchFilePath, matchArray);
  } catch (error) {
    throw error;
  }        
}

关键说明:

  • 使用Array.map()遍历原markets数组,为每个market对象生成仅包含id属性的新对象,得到过滤后的数组
  • 如果你不需要markets外层的额外数组(即希望markets直接是[{id: ...}, ...]),可以把markets: [filteredMarkets]改成markets: filteredMarkets
  • 把原代码的三元表达式拆分为if/else结构,提升代码可读性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:24:50