返回Array中重复元素的最佳方法

时间:2011-11-29 16:35:31

标签: javascript jquery

这是我用来返回重复元素的方式..但是当我的数组有大量带有长文本的项目时,我面临着浏览器关闭等最危险的性能问题..

var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7];
var sorted_arr = arr.sort();
var results = [];
for (var i = 0; i < arr.length - 1; i++) {
  if (sorted_arr[i + 1] == sorted_arr[i]) {
     results.push(sorted_arr[i]);
  }
}
alert(results);

请建议我这样做的最好方法

4 个答案:

答案 0 :(得分:5)

我没有得到你想要的,但如果你需要返回重复项,你可以使用缓存对象。这适用于数字或字符串或其他任何内容。

var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7];
var cache = {};
var results = [];
for (var i = 0, len = arr.length; i < len; i++) {
  if(cache[arr[i]] === true){
      results.push(arr[i]);
   }else{
       cache[arr[i]] = true;
   }

}
console.log(results);//returns an array with 9 and 4

当然,您可以执行其他操作,例如删除多个项目等。

编辑 - 我在how to remove duplicates from an array

上写了博客文章

答案 1 :(得分:5)

如果你有数组过滤器,你也有indexOf和lastIndexOf, 并且您可以在不进行排序的情况下返回重复项。

var results, arr= [9, 9, 111, 2, 3, 4, 4, 5, 4, 7];

if(arr.filter){
    results= arr.filter(function(itm, i){
        return arr.lastIndexOf(itm)== i && arr.indexOf(itm)!= i;
    });
}

else// use your loop method

alert(results)

/*  returned value: (Array)
9,4
*/

答案 2 :(得分:2)

假设Nicola的解决方案对您不起作用(因为它使用的内存与原始解决方案一样多:输入中每个元素存储两个元素,最坏情况),您可以使用重复搜索输入的较慢过程

这需要ECMAScript 5中的Array.indexOf方法。很多浏览器都有它。有关替代方案,请参阅How do I check if an array includes an object in JavaScript?

var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7];
var results = [];
for (var i = 0, len = arr.length - 1; i < len; i++) {
  if((results.indexOf(arr[i]) == -1) && (arr.indexOf(arr[i], i + 1) != -1)) {
      results.push(arr[i]);
   }
}
console.log(results);

这不使用比输入arr加上输出results更多的内存,但它是一个O(N ^ 2)算法,不必修改arr

答案 3 :(得分:1)

您的方法依赖于排序,这可能是也可能不是您用完空间/时间的原因之一。

删除重复项的规范方法是保留键的哈希映射(JS中的对象)。您获得的对象键不一定按您想要的顺序排列;你没有指定你是否也想要结果,但它们现在是。

您可以null原始阵列,因为您不再需要它;什么时候收集它取决于JS引擎。

您可以通过将“当前索引”保留在已排序的数组中来“删除”重复项,并仅在从计数器索引“向下”移动非重复元素时递增它,然后截断您返回的数组

结合最后两种技术应该意味着通常你只有一个带有有效引用的数组。

编辑示例。明确设置length.slice()创建一个新数组。

var have = {};
var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7];
arr = arr.sort();

for (var rIdx = 0, i = 0; i < arr.length; i++) {
    if (have[arr[i]]) {
        arr[rIdx++] = arr[i];
    } else {
        have[arr[i]] = true;
    }
}

arr.length = rIdx;
console.log(arr);