如何高效对比两个数组对象的数据差异?

爱学习的一硕 阅读 4

我从接口拿到了新旧两份用户配置数据,都是数组,每个元素是对象。想找出哪些项被修改、新增或删除了,但用 === 直接比较总是 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' }];
我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
打工人慧芳
这个问题我也折腾过,当时搞了好久才找到一个靠谱的方案。直接 === 比较确实没用,因为比较的是内存地址。

Lodash 的 _.isEqual 可以深度比较对象内容,但确实不适合直接用来找差异。我后来用的方案是:

1. 先用 id 把数据转成字典格式方便查找
2. 分三种情况处理:新增、删除、修改

给你个实用代码片段:

function compareArrays(oldArr, newArr, idKey = 'id') {
const oldMap = new Map(oldArr.map(item => [item[idKey], item]));
const newMap = new Map(newArr.map(item => [item[idKey], item]));

const added = [];
const removed = [];
const changed = [];

// 找出新增的
for (const [id, item] of newMap) {
if (!oldMap.has(id)) added.push(item);
}

// 找出删除的
for (const [id, item] of oldMap) {
if (!newMap.has(id)) removed.push(item);
}

// 找出修改的
for (const [id, newItem] of newMap) {
const oldItem = oldMap.get(id);
if (oldItem && !_.isEqual(oldItem, newItem)) {
changed.push({
old: oldItem,
new: newItem
});
}
}

return { added, removed, changed };
}


用的时候直接 compareArrays(oldData, newData) 就能拿到分类好的结果。这个方法我用了好多次了,挺稳的。

注意几个坑:
1. 要确保所有对象都有 id 字段,不然会漏数据
2. 嵌套对象要用 _.isEqual 深度比较
3. 性能问题:数据量大的话要考虑优化,这个方案是 O(n) 的

如果不想用 Lodash,可以用 JSON.stringify 简单比较,但要注意顺序问题,有时候两个内容相同的对象 stringify 结果可能不同。
点赞
2026-03-08 12:05