如何基于ID匹配从两个对象数组中拆分出更新和新增数据集
问题原因
你使用的map方法会返回与原数组长度完全一致的新数组,当ID匹配不到时对应的位置会返回undefined,不会自动过滤不符合条件的项,因此无法实现需求。
正确实现
首先建议先提取currentData的ID存入Set结构,相比每次遍历查找可以大幅提升匹配效率,尤其适合数据量较大的场景:
const currentIds = new Set(currentData.map(item => item.ID));
方案1:两次filter拆分(代码最简洁)
// ID存在于currentData的项存入updateData const updateData = inputData.filter(row => currentIds.has(row.ID)); // ID不存在于currentData的项存入newData const newData = inputData.filter(row => !currentIds.has(row.ID));
方案2:单次reduce拆分(性能更优)
只需要遍历inputData一次即可得到两个结果数组:
const { updateData, newData } = inputData.reduce((result, currentRow) => { currentIds.has(currentRow.ID) ? result.updateData.push(currentRow) : result.newData.push(currentRow); return result; }, { updateData: [], newData: [] });
结果验证
使用你提供的示例数据运行后,updateData会包含ID为2、3的对象,newData会包含ID为4的对象,完全符合预期。
内容的提问来源于stack exchange,提问作者SudoGaron
相关产品推荐
相关产品推荐

