高效比较两个大型对象数组并找出差异

5

我有两个大的对象数组,如下:

const array1 = [
    {
        userId: 83232932,
        name: 'Tom',
        profile_pic: 'http://..',
        age: 24,
        gender: 'F'
    },
    {
        userId: 2413535,
        name: 'Sam',
        profile_pic: 'http://..',
        age: 31,
        gender: 'M'
    }
]

还有一个几乎相等的数组。

这两个数组也可能有数千个对象,例如20k。

我需要比较它们并找到在第一个数组中但不在第二个数组中的对象。

现在我的做法是:

const missing = array1.filter(function(item1) {
    return !array2.some(function(item2) {
        return item1.userId === item2.userId;
    });
});

这种方法可以实现,但会导致我的应用程序在几秒钟内卡顿。

有更好的过滤数组的方法吗?或者我应该检查如何以及何时进行此比较?


1
使用传统的for循环总是比使用函数式方法更快,这是一些边际优化。无论如何,你都无法打败最坏情况下的O(N x M)。一个安全的方法是对于密集任务使用Worker API。 - KarelG
@KarelG 我一定会尝试使用旧的for循环,看看是否会有任何不同。 - Ilario
1个回答

7
您可以使用Set来对比筛选第一个数组。
const
    ids = new Set(array2.map(({ id }) => id)),
    missing = array1.filter(({ id }) => !ids.has(id));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接