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

如何对比两个对象数组生成带is_modified标记的新数组

原有代码问题

  • 双重循环逻辑会导致同一个新数组元素多次匹配老数组元素,出现重复插入的问题
  • Object.values(el).indexOf(el.name) > -1 判断无效,el.name本身是当前对象的属性,判断它是否在自身的值列表中永远成立,完全达不到匹配老数组同名元素的效果
  • 未处理新数组独有的元素逻辑

优化实现(推荐)

先将旧数组转换为映射表,时间复杂度从O(n*m)降低到O(n+m),适合任意数据量场景:

// 构建旧数据 书名-amount 映射表
const oldBookMap = new Map(oldBookDetails.map(item => [item.name, item.amount]))

// 直接修改原newBookDetails数组,符合你预期的console.log(newBookDetails)输出要求
newBookDetails.forEach(el => {
    // 旧数据不存在同名书籍 || 金额不一致时 is_modified 为true,否则为false
    el.is_modified = !oldBookMap.has(el.name) || oldBookMap.get(el.name) !== el.amount
})

console.log(newBookDetails)

如果不需要修改原newBookDetails数组,要生成独立的bookModified数组,调整为以下写法即可:

const oldBookMap = new Map(oldBookDetails.map(item => [item.name, item.amount]))
const bookModified = newBookDetails.map(el => {
    return {
        ...el,
        is_modified: !oldBookMap.has(el.name) || oldBookMap.get(el.name) !== el.amount
    }
})

console.log(bookModified)

输出结果

两种写法最终得到的数组都符合预期:

[
    {'name':'Harry pottar','amount':15, is_modified: true},
    {'name':'LOTR','amount':20, is_modified: false},
    {'name':'HR','amount':15, is_modified: true}
]

内容的提问来源于stack exchange,提问作者Sushant Rad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:06:04