从数组中删除重复的元素

Meh*_*nce 58 javascript arrays

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

var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10]
Run Code Online (Sandbox Code Playgroud)

我的目的是从数组中丢弃重复元素并获得这样的最终数组;

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)

如何在JavaScript中实现这一目标?

注意:数组未排序,值可以是任意顺序.

Nic*_*ngo 192

它更容易使用Array.filter:

var unique = arr.filter(function(elem, index, self) {
    return index === self.indexOf(elem);
})
Run Code Online (Sandbox Code Playgroud)

  • 这有效率如何?关注最坏情况运行时的关注取决于indexOf如何在线性时间运行,然后最坏情况时间为O(n ^ 2) (6认同)
  • .filter()遍历数组的所有元素,并仅返回回调返回true的那些元素..indexOf()返回数组中最左边元素的索引.如果有重复的元素,那么当它们的索引与最左边的元素进行比较时,它们肯定会被删除.有关更多信息,请访问https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/filter :) @MadPhysicist (5认同)
  • 最简单,最有效的方法:)谢谢 (2认同)

Den*_*ret 13

由于元素尚未订购,您无需构建地图,这是一个快速的解决方案:

var newarr = [arr[0]];
for (var i=1; i<arr.length; i++) {
   if (arr[i]!=arr[i-1]) newarr.push(arr[i]);
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果你的数组没有排序,使用地图:

var newarr = (function(arr){
  var m = {}, newarr = []
  for (var i=0; i<arr.length; i++) {
    var v = arr[i];
    if (!m[v]) {
      newarr.push(v);
      m[v]=true;
    }
  }
  return newarr;
})(arr);
Run Code Online (Sandbox Code Playgroud)

请注意,到目前为止,这比接受的答案要快得多.


Kev*_*sox 10

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

function squash(arr){
    var tmp = [];
    for(var i = 0; i < arr.length; i++){
        if(tmp.indexOf(arr[i]) == -1){
        tmp.push(arr[i]);
        }
    }
    return tmp;
}

console.log(squash(arr));
Run Code Online (Sandbox Code Playgroud)

工作示例 http://jsfiddle.net/7Utn7/

旧浏览器上indexOf的兼容性


小智 6

你可以尝试这样使用jquery

 var arr = [1,2,2,3,4,5,5,5,6,7,7,8,9,10,10];
    var uniqueVals = [];
    $.each(arr, function(i, el){
        if($.inArray(el, uniqueVals) === -1) uniqueVals.push(el);
    });
Run Code Online (Sandbox Code Playgroud)


Gri*_*han 5

尝试从删除数组中的重复项(简单):

Array.prototype.removeDuplicates = function (){
  var temp=new Array();
  this.sort();
  for(i=0;i<this.length;i++){
    if(this[i]==this[i+1]) {continue}
    temp[temp.length]=this[i];
  }
  return temp;
} 
Run Code Online (Sandbox Code Playgroud)

编辑:

此代码不需要排序:

Array.prototype.removeDuplicates = function (){
  var temp=new Array();
  label:for(i=0;i<this.length;i++){
        for(var j=0; j<temp.length;j++ ){//check duplicates
            if(temp[j]==this[i])//skip if already present 
               continue label;      
        }
        temp[temp.length] = this[i];
  }
  return temp;
 } 
Run Code Online (Sandbox Code Playgroud)

(但不是经过测试的代码!)