You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Lodash合并数组时如何保留旧字段并更新view.id匹配项

解决方案

你用_.unionBy达不到预期的原因是,该方法的去重逻辑是直接保留首个命中匹配规则的完整对象,不会对两个匹配对象的字段做合并处理,因此会出现要么丢失原数组id、要么丢失更新内容的问题。

你可以通过keyBy+字段合并+补全新增项的逻辑实现需求,示例代码如下:

// 1. 将更新数组转为以view.id为键的映射表,方便快速查找匹配项
const updatedMap = _.keyBy(updatedValue, 'view.id')

// 2. 遍历原数组,匹配到更新项的做字段合并,未匹配的保留原有内容
const processedOldItems = lastValue.map(oldItem => {
  const matchedUpdate = updatedMap[oldItem.view.id]
  // 合并规则:旧项在前,更新项在后,更新项的字段会覆盖旧项同名字段,同时保留旧项独有的id字段
  return matchedUpdate ? _.merge({}, oldItem, matchedUpdate) : oldItem
})

// 3. 筛选出更新数组中在原数组里不存在的新增项
const newItems = updatedValue.filter(updateItem => 
  !_.some(lastValue, { view: { id: updateItem.view.id } })
)

// 4. 合并两部分得到最终结果
const finalResult = [...processedOldItems, ...newItems]

如果你的业务场景中不需要深层合并对象(比如view下的字段不会有更新差异),也可以把_.merge替换为浅合并的对象展开写法,性能更好:

return matchedUpdate ? {...oldItem, ...matchedUpdate} : oldItem

最终输出结果和你预期的完全一致。


内容的提问来源于stack exchange,提问作者Dinesh Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:36:03