如何对比两个对象数组生成带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
相关产品推荐
相关产品推荐

