【问题标题】:Compare two large arrays of objects effectively and find the differences有效地比较两个大型对象数组并找出差异
【发布时间】:2018-09-06 10:37:52
【问题描述】:

我有两个大型对象数组,例如:

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;
    });
});

这可行,但它会阻止我的应用程序的 UI 几秒钟。

是否有更好的方法来过滤数组,或者我应该查看如何以及何时进行比较?

【问题讨论】:

  • 使用普通的老式 for 循环,它总是比使用函数式方法更快。这是边际上的一些优化。无论如何,您无法击败最坏的情况O(N x M)。一种保存方法是使用Worker API 处理密集型任务。
  • @KarelG 我一定会尝试旧的 for 循环,看看会不会有什么不同

标签: javascript arrays ecmascript-6


【解决方案1】:

您可以使用Set 并检查是否过滤了第一个数组。

const
    ids = new Set(array2.map(({ id }) => id)),
    missing = array1.filter(({ id }) => !ids.has(id));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多