从排序的数组列表中提取唯一元素

时间:2014-06-10 16:37:02

标签: javascript algorithm

到目前为止我做了什么:

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

您可能已经注意到,我的逻辑是检查i+1th的{​​{1}}元素是否等于input的{​​{1}}元素,如果不是,请添加它到ith但是,这段代码不起作用。它输出:output

我错过了什么?

jsFiddle

4 个答案:

答案 0 :(得分:4)

输出尺寸并不总是在增加...... 它应该是......

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

答案 1 :(得分: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]);
}

这通常是如何完成的,因为通常您无法访问输出(例如,它被传递以进行进一步处理而不是存储在数组中)。

答案 2 :(得分:3)

查看其中的最后一项时,您需要使用output的长度:

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

答案 3 :(得分: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
*/