2014-06-10 57 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 
*/