【问题标题】:Compare two array of objects in javascript/angular and return as soon first condition satisfies (any lodash operator)比较 javascript/angular 中的两个对象数组并在第一个条件满足时立即返回(任何 lodash 运算符)
【发布时间】:2026-02-05 06:10:01
【问题描述】:

假设我有两个对象数组:

let ar1 = [{
    id: 1,
    name: 'abc',
    job: 'dev'
}, {
    id: 2,
    name: 'xyz',
    job: 'qa'
},{
    id: 3,
    name: 'pqr',
    job: 'dev'
  }
];
    
let arr2 = [{
    id: 1,
    name: 'abc',
    job: 'dev'
},{
    id: 2,
    name: 'zzz',
    job: 'qa'
},{
    id: 3,
    name: 'pqr',
    job: 'dev'
}];

我需要比较它们,以便我得到“真”并退出比较而不进一步迭代,因为两个对象之间的第二个元素中的名称不同。

我尝试了以下代码:

    private compareObjects(obj1, obj2) {
      obj1.forEach((x) => {
         obj2.forEach((y) => {
            if (x.id === y.id) {
            return (!_.isEqual(x, y));
             }
         });
      });
    }

【问题讨论】:

  • forEach 预计不会返回结果。
  • 您无法突破.forEach,这是设计使然,但您可以突破for... of,也是设计使然。在这种情况下,您想使用 for...of。但是,如果您想要严格比较,则不需要双 for 循环,因为 arr1.length 必须与 arr2.length 相同(或者它们不相等)并且您还知道 arr1[i] 必须等于 arr2[i],因此您可以使用一个 let i=0, e=arr1.length; i <e; i++ 并在那里节省大量运行时间。
  • 您应该考虑使用lodash.com/docs/#find 而不是forEach。找到不同的地方,如果你找到了东西,在顶层,返回 false (不等于)。否则,返回 true。
  • 您并没有完全告诉我们您要完成什么,迭代这两个数组有什么意义?根据目标,您可以使用Array.prototype.find()

标签: javascript angular lodash


【解决方案1】:

我建议 reduce-ing 将第二个数组用于测试第一个数组所需的内容:{ id : name }。这是第二个数组的单次传递。

然后使用find 对第一个数组进行单次测试,在第一次不匹配时停止。

let ar1 = [{
    id: 1,
    name: 'abc',
    job: 'dev'
}, {
    id: 2,
    name: 'xyz',
    job: 'qa'
},{
    id: 3,
    name: 'pqr',
    job: 'dev'
  }
];
    
let arr2 = [{
    id: 1,
    name: 'abc',
    job: 'dev'
},{
    id: 2,
    name: 'zzz',
    job: 'qa'
},{
    id: 3,
    name: 'pqr',
    job: 'dev'
}];

let index = arr2.reduce((acc, e) => {
  acc[e.id] = e.name
  return acc
}, {})


let firstMismatched = ar1.find(e => index[e.id] !== e.name) 
console.log(firstMismatched)

【讨论】:

    最近更新 更多