Javascript - 快速删除对象数组中的重复项

时间:2013-02-01 16:22:04

标签: javascript jquery algorithm duplicates

我有两个包含对象的数组,例如:

[{"Start": 1, "End": 2}, {"Start": 4, "End": 9}, {"Start": 12, "End": 16}, ... ]

我想在删除重复项时合并2个数组。目前,我正在做以下事情:

array1.concat(array2);

然后我正在进行嵌套的$.each循环,但随着我的数组越来越大,这需要O(n^2)时间来执行,并且不可扩展。

我认为有更快的方法可以做到这一点,但是,我发现的所有示例都使用字符串或整数。

任何推荐的算法或方法可以加快速度吗?

3 个答案:

答案 0 :(得分:2)

此答案基于以下假设:订单无关紧要,您可以从对象创建唯一键。

将数组a中的所有n个条目复制到对象c,创建一个唯一键,然后将所有m个条目从数组b复制到该对象(这将自动消除重复项),并且您已完成{{ 1}}:

O(n+m)

此对象中的这种表示法有点多余,但您在合并两个数组时非常快。也许这可以进一步改善。

答案 1 :(得分:1)

先将对象排序,从低到高排序。 O(n log n)快速排序。

然后你可以制作修剪算法,利用这种排序在O(2n)的一个循环中遍历两个数组。

合并原始数组和修剪过的数组。


请记住,尽管JavaScript中的对象没有顺序,但您无法对它们进行排序。转换为数组,保留引用并对其进行排序。

答案 2 :(得分:0)

我对javascript并不熟悉,所以不是百分之百确定这是可行的(不确定比较对象的等同性等等),但在java或其他语言中,这样的东西可能会起作用:

  • 迭代第一个数组。
  • 将每个元素存储到“计数器”哈希映射中,其中键是对象,值是计数。

在第一次通过之后,你应该有:

{{"Start": 1, "End": 2}:1, {"Start": 4, "End": 9}:1, {"Start": 12, "End": 16}:1, ... }
  • 然后,迭代第二个数组
  • 对于每个元素,查找计数器hashmap内的当前元素。
  • 如果计数器hashmap包含与当前元素匹配的键,则它是重复的
  • 否则,追加到第一个数组。

可能比必须先排序要快一些(如果可以将对象用作键,那么)?