2011-11-29 91 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 
*/