如何遍历数组提取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
相关产品推荐
相关产品推荐

