JavaScript根据id匹配替换数组中对应对象的实现问题
错误原因
你当前的代码硬编码了splice的操作位置,没有先根据id匹配查找array1中对应对象的实际索引,因此会出现替换位置错误、数组长度异常的问题。你给出的错误输出也说明你实际执行的splice参数和你写的不一致,大概率是误写成了splice(0, 0, array2[0])(即在索引0位置插入新元素,不删除原有元素),才会出现重复的id:145对象。
可行解决方案
方案1:生成新数组(推荐,无副作用)
先把array2转为id到对象的映射,再遍历array1匹配替换,该方案时间复杂度更低,适合数组数据量较大的场景:
const updateMap = new Map(array2.map(item => [item.id, item])) array1 = array1.map(item => updateMap.has(item.id) ? updateMap.get(item.id) : item)
方案2:直接修改原数组(符合你原本用splice的预期)
遍历array2的更新项,先查找匹配id的索引,再执行替换操作:
array2.forEach(update => { const targetIdx = array1.findIndex(item => item.id === update.id) if (targetIdx !== -1) { array1.splice(targetIdx, 1, update) } })
两种方案执行后,array1都会得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

