从矩阵javascript中删除重复的行

时间:2013-02-17 19:03:10

标签: javascript arrays duplicate-removal

请阅读:我知道这感觉就像Stack Overflow上的那些问题一样令人作呕,但我发誓我找不到一个好的答案。 Besides, marking this as "Possible duplicate" would be too meta!

我有一个特定顺序的值矩阵(在javascript中):

[[1,2],   [1,2],   [3,4],   [5,6]   [5,6]]

但是我最近了解到Google charts crashes when there are identical rows。我需要删除重复项;但是,数组相当大,我无法承受天真实现的二次时间。

通常情况下,如果每行都是可以清洗的,我会将它们添加到字典{ }中以查看我已经看过的内容;但是,javascript不允许对数组进行哈希处理。

最好的方法是什么?我想我可以将每行的数组转换为字符串并使用它作为键,但这感觉就像一个非常脏(并且可能很慢)的黑客。我真的很喜欢你的建议。

2 个答案:

答案 0 :(得分:1)

您可以使用Set和JSON Stringify / Parse轻松删除重复项。因此,这种方法将保持矩阵的顺序。

const array = [[1, 2],[1, 2],[3, 4],[5, 6],[5, 6]];
const set = new Set(array.map(JSON.stringify));
const arr = [...set].map(JSON.parse);

console.log(arr);// output : [[1,2], [3,4], [5,6]]

答案 1 :(得分:0)

我认为内存使用会是一个问题,因为数组相当大,所以这里的算法或多或少都存在。垮台是我们必须进行昂贵的分拣操作,这取决于尺寸,可能是耗时的。通过使用存储器权衡而不是这种方法,可以显着改善该算法。它如下:

  1. 将当前展示位置添加到数组的末尾

    for(var i = 0; i < arr.length;i++){
      arr[i].push(i);
    }
    
  2. 对数组进行排序。

    arr.sort();
    
  3. 查找并删除dup条目。

    outer:
    for(var i = 0; i<arr.length-1; i++){
      for(var j = 0; j<arr[i].length-1; j++){
        if(arr[i][j] != arr[i+1][j]){
          continue outer;
        }
      }
      arr.splice(i,1);
      console.log("Found it!" + i);
    }
    
  4. 将阵列放回原位。

    arr.sort(function(a,b){
      if (a[a.length-1] < b[a.length-1])
        return -1;
      if (a[a.length-1] > b[a.length-1])
        return 1;
      return 0;
    });
    
  5. 删除添加的元素。

    for(var i = 0; i < arr.length; i++){
      arr[i].pop();
    }