请阅读:我知道这感觉就像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不允许对数组进行哈希处理。
最好的方法是什么?我想我可以将每行的数组转换为字符串并使用它作为键,但这感觉就像一个非常脏(并且可能很慢)的黑客。我真的很喜欢你的建议。
答案 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)
我认为内存使用会是一个问题,因为数组相当大,所以这里的算法或多或少都存在。垮台是我们必须进行昂贵的分拣操作,这取决于尺寸,可能是耗时的。通过使用存储器权衡而不是这种方法,可以显着改善该算法。它如下:
将当前展示位置添加到数组的末尾
for(var i = 0; i < arr.length;i++){
arr[i].push(i);
}
对数组进行排序。
arr.sort();
查找并删除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);
}
将阵列放回原位。
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;
});
删除添加的元素。
for(var i = 0; i < arr.length; i++){
arr[i].pop();
}