JS如何匹配入参数组更新已有对象数组 新增不存在的数据
实现方案
基础实现(小数据量场景)
核心逻辑是遍历待更新数组的每个元素,到已有数组中匹配相同id的元素,匹配成功则更新属性,失败则追加到数组末尾:
updateData.forEach(updateItem => { // 匹配相同id的已有元素 const existed = existingData.find(item => item.id === updateItem.id) if (existed) { // 覆盖更新属性,保留原有未被修改的字段 Object.assign(existed, updateItem) } else { // 无匹配则追加新元素 existingData.push(updateItem) } })
这个方案写法简单直观,适合数据量不大的场景,时间复杂度为O(n*m)(n为更新数组长度,m为已有数组长度)。
高效实现(大数据量场景)
如果数组长度较大,可通过Map做索引把查找复杂度降到O(1),整体时间复杂度优化为O(n+m):
// 用已有数组生成id为键的Map索引 const dataMap = new Map(existingData.map(item => [item.id, item])) updateData.forEach(updateItem => { // 存在则合并属性,不存在则直接新增,无需额外判断 dataMap.set(updateItem.id, {...dataMap.get(updateItem.id) || {}, ...updateItem}) }) // 转换回数组得到最终结果 existingData = Array.from(dataMap.values())
该方案会自动处理「更新已有元素」和「追加新元素」两种逻辑,兼容性更强,适合数据量较大的生产场景。
内容的提问来源于stack exchange,提问作者Joker Bench
相关产品推荐
相关产品推荐

