如何高效对比两个数组对象的数据差异?
我从接口拿到了新旧两份用户配置数据,都是数组,每个元素是对象。想找出哪些项被修改、新增或删除了,但用 === 直接比较总是 false,因为引用不同。
试过遍历对比 id 和字段值,但代码又长又容易漏。有没有更简洁可靠的方案?比如用 Lodash 的 _.isEqual 配合 diff 逻辑?
const oldData = [{ id: 1, name: 'Alice', active: true }];
const newData = [{ id: 1, name: 'Alice Updated', active: false }, { id: 2, name: 'Bob' }];
Lodash 的
_.isEqual可以深度比较对象内容,但确实不适合直接用来找差异。我后来用的方案是:1. 先用 id 把数据转成字典格式方便查找
2. 分三种情况处理:新增、删除、修改
给你个实用代码片段:
用的时候直接
compareArrays(oldData, newData)就能拿到分类好的结果。这个方法我用了好多次了,挺稳的。注意几个坑:
1. 要确保所有对象都有 id 字段,不然会漏数据
2. 嵌套对象要用 _.isEqual 深度比较
3. 性能问题:数据量大的话要考虑优化,这个方案是 O(n) 的
如果不想用 Lodash,可以用 JSON.stringify 简单比较,但要注意顺序问题,有时候两个内容相同的对象 stringify 结果可能不同。