从数组中删除重复元素

IT技术 javascript arrays
2021-03-06 18:04:55

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

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

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

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

这如何在 JavaScript 中实现?

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

5个回答

使用更容易Array.filter

var unique = arr.filter(function(elem, index, self) {
    return index === self.indexOf(elem);
})
.filter() 遍历数组的所有元素,只返回回调返回 true 的元素。.indexOf() 返回数组中最左边元素的索引。如果有重复的元素,那么当它们的索引与最左边的元素进行比较时,它们肯定会被删除。有关更多信息,请查看developer.mozilla.org/it/docs/Web/JavaScript/Reference/... :) @MadPhysicist
2021-04-29 18:04:55
@AbKDs 请详细说明这一点
2021-05-01 18:04:55
不过,这个答案对于非常小的列表仍然适用。它的优点是代码非常简单,因此与使用辅助存储的代码相比,不太可能出现错误并且阅读起来也更轻松。但它不太灵活:如果您只想根据列表中的单个项目字段来消除重复项,它就行不通,而其他解决方案很容易适应。
2021-05-08 18:04:55
@MehmetInce 它根本不是“高效”的,它在 O(n^2) 中运行
2021-05-16 18:04:55
这效率如何?注意解释最坏情况的运行时间取决于 indexOf 如果它在线性时间内运行,那么最坏情况的时间是 O(n^2)
2021-05-20 18:04:55

由于元素尚未排序,因此您不必构建地图,有一个快速的解决方案:

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

如果您的数组未排序,您将使用 map :

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

请注意,到目前为止,这比公认的答案要快得多。

数组并不总是排序的。
2021-04-23 18:04:55
对于无序数组,它也非常快。谢谢!
2021-04-23 18:04:55
这是一个很好的答案。不过,我会使用 ES6 Set 而不是对象,这样列表中的项目就不必是字符串。(显然,在写出答案时,这不是一个选项。)
2021-04-26 18:04:55
它比那更容易使您的方法更简单 var m = []; arr.forEach( v => m[v]=true ); var newarr = Object.keys(m); 很简单,对吧?
2021-05-06 18:04:55
很棒的答案!;)
2021-05-09 18:04:55
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));

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

indexOf 在旧浏览器上的兼容性

你可以试试这样使用 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);
    });

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

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

编辑:

此代码不需要排序:

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

但不是经过测试的代码!

@thg435 我{在第一个代码中有一个简单的错误,这就是为什么它不起作用,现在已更正和测试。
2021-04-21 18:04:55
也许更好地测试不平等并处理 continue
2021-04-25 18:04:55
此功能不仅删除重复项,还进行排序。为什么用这样一个特定的函数来阻碍 Array 的原型(它不适用于任何类型的数组,因为大多数不能直接排序)?
2021-05-15 18:04:55
@Matanya 我正在改进我的答案
2021-05-17 18:04:55