2011-11-29 46 views
4

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

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); 

请建议我这样做

+0

可能重复http://stackoverflow.com/questions/840781/easiest-way-to-find-duplicate-values-in-a-javascript-array –

+0

是数组键唯一的整数?此外,你的真实数组和其中的项目有多长时间? – hugomg

+2

@Saifuddin神圣的废话甚至是相同的阵列。这让我相信这是一个关于消费的问题,而不是技术。 –

回答

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

你的方法的最佳途径依赖于一种,可能会或可能不会是你运行的空间/时间的原因之一。

删除重复项的规范方法是保留键(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); 
+0

或多或少我写的! :) –

+0

@NicolaPeluchetti不完全;你还有一个额外的数组。看起来你要赢了;) –

+0

@DᴀᴠᴇNᴇᴡᴛᴏɴ你能否给我提供一些示例代码。 :-) – Exception

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

4

如果你有数组过滤器,你也有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 
*/