删除数组中的重复元素

时间:2014-02-19 03:49:01

标签: javascript jquery

例如,我有一个这样的数组;

var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10]

如果重复元素,请将其完全删除

var arr = [1, 3, 4, 6, 8, 9]

任何提示,链接或代码示例都很有用 提前谢谢你!

6 个答案:

答案 0 :(得分:5)

过滤出多于1个索引的项目

var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10];

arr = arr.filter(function (item, index, arr) {
    return arr.indexOf(item) == arr.lastIndexOf(item);
});

arr

/*  returned value: (Array)
1,3,4,6,8,9
*/

答案 1 :(得分:2)

不需要库,ES ed 3支持就足够了。如果数组按OP排序,则:

function removeDups(a) {
  var i = a.length && a.length - 1;
  while (i) {
    if (a[i] == a[--i]) {
      a.splice(i, 1);
    }
  }
  // Not required, but convenient
  return a;
}

修改

要使用未排序的数组“完全”删除所有重复项(使用原始值或对象值),请考虑:

// Removes duplicated elements comlpetely,
// e.g. [1,1,2,3,3] => [2]
// Requires ES5 Array.prototype.indexOf
function removeDupsUnsorted(a) {
  var i = a.length;
  var idx, v;

  while (--i > -1) {
    v = a[i];
    idx = a.indexOf(v);

    if (idx != i) {

      do {
        a.splice(idx, 1);
        idx =  a.indexOf(v);
        i--;
      } while (idx != -1)
      ++i;
    }
  }
  return a;
}

答案 2 :(得分:1)

这可能是一个O(n)解决方案,假设属性查找和插入是O(1):

var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10];

var included = arr.reduce( function(a,b) {
    a[b] = a[b]===undefined; return a}, {} );

arr.filter( function(c) { return included[c]; } )
// [1, 3, 4, 6, 8, 9]

使用直接for循环实际上更快,而不是reducefilter

function removeDups5(a) {
    var included = {}, i;
    for( i=0 ; i<a.length ; ++i ) included[a[i]] = a[i] in included;
    for( --i ; 0<=i ; --i ) if(included[a[i]]) a.splice(i,1);
    return a;
}

这是jsperf将这些答案中的一些相互比较。这个解决方案目前处于领先地位,看起来阵列的时间越长。 (任何人都可以随意添加您的解决方案。)

答案 3 :(得分:0)

您可以使用filter

var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10];

arr = arr.filter(function (item, index, arr) {
    return arr.indexOf(item) == arr.lastIndexOf(item);
});

console.log(arr); // [1, 3, 4, 6, 8, 9]

<强> Fiddle Demo

答案 4 :(得分:0)

假设arr已排序,这是一个O(n)解决方案。

var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10]; //Make sure it's sorted!

var no_add;

var other = [];

other.push(arr[0]);

for (var i = 1; i < arr.length; i++)
{
    if(no_add == arr[i])
        continue;
    if(other[other.length - 1] == arr[i])
    {
        no_add = other.pop();
        continue;
    }   
    else
        other.push(arr[i]);

}

console.log(other); //[1, 3, 4, 6, 8, 9] 

答案 5 :(得分:0)

我有点累了,但这也应该可以解决问题(ECMA5)并且原始顺序无关紧要。

的Javascript

var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10];

arr = arr.filter(function (value, index, array) {
    return (!this[value] && array.lastIndexOf(value) === index) || !(this[value] = true);
}, {});

console.log(JSON.stringify(arr));

输出

[1,3,4,6,8,9]

jsFiddle