2014-06-10 56 views
1

我迄今所做的:提取數組排序列表的獨特元素

var input = [1, 1, 3, 3, 3, 5, 5, 5, 9, 9, 9, 9]; 

var output = []; 

/*input.forEach(function(element){ // works as intended, but I know we can do better :) 
    if(output.indexOf(element) == -1) 
     output.push(element); 
});*/ 

output.push(input[0]); // first element is always unique! 

for(var i=1; i<input.length; i++){ // check rest of the elements 
    if(input[i] != output[i-1]) 
     output.push(input[i]); 
} 

console.log(output); 

正如你可能已經注意到,我的邏輯是檢查的inputi+1th元素等於outputith元素,如果沒有,將它添加到output但是,此代碼不起作用。它輸出:[1, 3, 3, 3, 5, 5, 5, 9, 9, 9, 9]

我錯過了什麼?

jsFiddle

+0

哦JavaScript中,在所有其他語言,你很可能已經得到了當試圖訪問未寫入還沒有一個動態數組中的條目.. – amit

回答

4

此,如果你比較input[i]input[i-1],例如是輕鬆了不少:

output.push(input[0]); // first element is always unique! 

for(var i=1; i<input.length; i++){ // check rest of the elements 
    if(input[i] != input[i-1]) // NOTE: changed output to input 
     output.push(input[i]); 
} 

這通常是它是如何做的,因爲往往你沒有訪問輸出(例如,它被傳遞以供進一步的處理,而不是存儲在一個數組)。

+0

好主意!謝了哥們! –

3

您需要使用的output長度在最後一個項目在尋找它時:

if(input[i] != output[output.length-1]) 
4

輸出尺寸並不總是增加... 應該...

if(input[i]!=output[output.length-1]) 
+0

是的,這將解決這個問題,如果你不想例外使用output [output.length-1],你使用一個temp變量並保存最後的輸出值,或者只是檢查(input [i]!= input [i-1]),因爲它是一個排序列表。 –

+0

如果你不想使用output [output.length-1]並使用一個單獨的變量,並且每當你將一個元素推送到輸出時,就使用一個單獨的變量 – Srinath

+0

如果你不想使用output [output.length- 1] – Srinath

0

您可以通過過濾通過的indexOf值 -

這具有不需要列表的優勢排序的項目將返回每個值的第一個項目。

var input = [5,9,5,3,9,3,5,1,3,9,9,1]; 

var output =input.filter(function(itm,i, A){ 
return A.indexOf(itm)==i; 
}); 

output.sort() 

/* returned value: (Array) 
1,3,5,9 
*/