JavaScript 按id前缀关联合并slicesRank与slicesCount数组为指定结构对象
合并双数组的逻辑问题修正
原代码的核心错误
- 取值层级错位:
date、measurement并非slicesRank[i]的顶层属性,而是嵌套在slicesRank[i].values数组的每一项元素内部,直接在数组对象层级读取属性必然得到undefined - 结构不符合预期:代码直接将
values赋值为单个对象,没有遍历原有长度为46的values数组合并逐点数据,无法生成要求的数组结构 - 匹配可靠性差:直接依靠数组索引对应rank和count元素,一旦两个数组的顺序错位,就会出现合并错配
可运行的修正代码
const sliceNew = []; // 构建count数据的id映射,避免索引顺序不匹配的问题 const countDataSet = new Map( slicesCount.map(item => [ item.id.replace('=count', ''), item.values ]) ); for (let i = 0; i < slicesRank.length; i++) { const currentRankItem = slicesRank[i]; const baseId = currentRankItem.id.replace('=rank', ''); const matchedCountValues = countDataSet.get(baseId); // 逐点合并两个维度的measurement数据 const mergedValues = currentRankItem.values.map((rankPoint, pointIndex) => { const countPoint = matchedCountValues?.[pointIndex]; return { date: rankPoint.date, rank: rankPoint.measurement, count: countPoint?.measurement }; }); sliceNew.push({ id: baseId, values: mergedValues }); }
修正点说明
- 用Map存储count维度的id和对应values数据,替代硬索引匹配,即便两个数组顺序不一致也能正确匹配同前缀id的元素
- 遍历rank维度的values数组,逐一对齐同位置的两个数据点,最终生成的
values会保持原有的46长度数组结构 - 调整属性读取路径,从每一个数据点对象上读取
date、measurement字段,解决之前取值层级错误导致的values全为undefined的问题 - 增加空值兼容逻辑,当匹配不到对应count数据时不会抛出运行时错误
内容的提问来源于stack exchange,提问作者dhs4402
相关产品推荐
相关产品推荐

