如何从数组中删除重复的条目,同时保留非连续的重复项?

时间:2015-06-08 18:49:17

标签: javascript arrays

我有一个像var arr = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4, 5, 5, 5];这样的数组我真的希望输出为[5,2,9,4,5]。我的逻辑是:

  • 逐个浏览所有元素。
  • 如果元素与prev元素相同,请计算元素并执行newA = arr.slice(i, count)
  • 之类的操作
  • 新数组应该只填充相同的元素。
  • 对于我的示例输入,前3个元素是相同的,因此newA将类似arr.slice(0, 3)newB将是arr.slice(3,5),依此类推。

我尝试将其转换为以下代码:

function identical(array){
    var count = 0;
    for(var i = 0; i < array.length -1; i++){
        if(array[i] == array[i + 1]){
            count++;
            // temp = array.slice(i)
        }else{
            count == 0;
        }
    }
    console.log(count);
}
identical(arr);

我在确定如何输出表示数组中相同元素组的元素时遇到问题。如果元素不相同,则应按原始数组中的顺序输出。

5 个答案:

答案 0 :(得分:13)

使用array.filter(),您可以检查每个元素是否与之​​前的元素相同。

这样的事情:

var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4, 5, 5, 5];

var b = a.filter(function(item, pos, arr){
  // Always keep the 0th element as there is nothing before it
  // Then check if each element is different than the one before it
  return pos === 0 || item !== arr[pos-1];
});

document.getElementById('result').innerHTML = b.join(', ');
<p id="result"></p>

答案 1 :(得分:4)

如果你纯粹是通过算法看而不使用任何函数

var arr = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4, 5, 5, 5];

    function identical(array){

        var newArray = [];
        newArray.push(array[0]);
        for(var i = 0; i < array.length -1; i++) {
            if(array[i] != array[i + 1]) {
                newArray.push(array[i + 1]);
            }
        }
        console.log(newArray);
    }
    identical(arr);

Fiddle;

答案 2 :(得分:2)

使用reduce

的另一种方式

var arr = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4, 5, 5, 5];

var result = arr.reduce(function(acc, cur) {
  if (acc.prev !== cur) {
    acc.result.push(cur);
    acc.prev = cur;
  }
  return acc;
}, {
  result: []
}).result;


document.getElementById('d').innerHTML = JSON.stringify(result);
<div id="d"></div>

答案 3 :(得分:1)

有点hackey,但是,好吧,我喜欢它。

var arr = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4, 5, 5, 5];
var arr2 = arr.join().replace(/(.),(?=\1)/g, '').split(',');

给你

[5,2,9,4,5]

不可否认,如果您使用多个字符的子字符串,这将会失败,但只要情况不是这样,这应该可以正常工作。

答案 4 :(得分:0)

试试这个:

var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4, 5, 5, 5];

uniqueArray = a.filter(function(item, pos) {
return a.indexOf(item) == pos;
});

请参阅Remove Duplicates from JavaScript Array