【问题标题】:Fastest way to get all the same elements from an array existing in an other one [duplicate]从另一个数组中获取所有相同元素的最快方法[重复]
【发布时间】:2020-05-24 14:51:51
【问题描述】:

我需要一种更快的方法来从一个存在于另一个数组中的数组中获取所有相同的元素。

我有两个非常大的数组(A 和 B),其中包含 Date 对象(>100k 个元素)。 数组 B 包含数组 A 中元素的子集。 我需要为数组 B 中包含的元素过滤数组 A。 那么,为什么不直接使用 Array B 呢?我需要保留 Array A 的引用。

目前我正在使用此代码:

const A = [];
const B = [];

const result = A.filter((s) => {
     return B.indexOf(s) !== -1;
});

这种方式很慢。使用我的数组执行该操作需要超过 2 分钟。

【问题讨论】:

  • 它们是仅包含 Date 对象的数组,还是包含 Date 对象的对象数组?查看每个数组中元素的示例会有所帮助。

标签: javascript arrays


【解决方案1】:

先把B数组变成Set。 Set#hasO(1),但 Array#indexOf / Array#includesO(n)

const bSet = new Set(B);
const result = A.filter(item => bSet.has(item));

这将大大提高性能。你might 可以通过使用for 循环而不是filter 使其更快一点,但改进可能会非常小。

这在两个数组都包含原语或包含对相同对象的引用时有效。如果对象不同,.indexOf.has.includes 都不起作用,在这种情况下,策略是先以某种方式将 B 中的所有对象序列化为一组原语,然后执行相同的操作在遍历 A 以查看它是否包含在 B 中时。

【讨论】:

  • @Alnitak 他的indexOf 方法有效,所以Set#has 也有效。数组必须包含对相同对象的引用。
  • 啊,是的,说得好,但对于一般情况来说可能值得一提。
  • 疯了,现在该死的快??谢谢!
【解决方案2】:

如果你对类型有灵活性,你总是可以让 B 包含一个指向父 A 的指针,这你不需要搜索 A 的所有子元素来确定你是否会在那里找到 B -但我不确定一个 B 是否可以有多个 A 等等...

【讨论】:

    猜你喜欢
    • 2021-07-15
    • 2014-03-03
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    相关资源
    最近更新 更多