【问题标题】:Delete duplicate elements from an array [duplicate]从数组中删除重复元素[重复]
【发布时间】:2013-05-20 19:29:38
【问题描述】:

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

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 中实现这一点?

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

【问题讨论】:

  • 您可以遍历数组并将所有元素复制到地图中。
  • @Devolus 仅对字符串和数字有效,不能使用对象或数组作为索引键。
  • 这是一个解决方案,但也是蛮力解决方案。有没有更聪明(有效)的方法?
  • 对数组进行排序,迭代,如果与上次不同,则将元素推送到新数组。
  • @Devolus:但是 JavaScript 不像 Java。

标签: javascript arrays


【解决方案1】:

使用Array.filter 更容易:

var unique = arr.filter(function(elem, index, self) {
    return index === self.indexOf(elem);
})

【讨论】:

  • 效率如何?注意解释最坏情况的运行时间取决于 indexOf 如果它以线性时间运行,那么最坏情况的时间是 O(n^2)
  • @AbKDs 请详细说明
  • @MehmetInce 它根本不是“高效”的,它在 O(n^2) 中运行
  • .filter() 遍历数组的所有元素并仅返回那些回调返回 true 的元素。 .indexOf() 返回数组中最左边元素的索引。如果有重复的元素,那么当它们的索引与最左边的索引进行比较时,它们肯定会被删除。欲了解更多信息,请查看developer.mozilla.org/it/docs/Web/JavaScript/Reference/… :) @MadPhysicist
  • 这个答案仍然适用于非常小的列表。它的优点是代码非常简单,因此与使用辅助存储的代码相比,出现错误的可能性更低,阅读的努力也更少。但它不太灵活:如果您想仅基于列表中的单个项目字段消除重复项,它就行不通,而其他解决方案很容易适应这种情况。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 数组并不总是排序的。
  • 它比这更容易让你的方法更简单 var m = []; arr.forEach(v => m[v]=true); var newarr = Object.keys(m);简单,对吧?
  • 这是一个很好的答案。我会使用 ES6 Set 而不是对象,因此列表中的项目不必是字符串。 (显然,在写答案时,这不是一个选项。)
  • 无序数组也非常快。谢谢!
  • 很棒的答案! ;)
【解决方案3】:
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/

Compatibility for indexOf on old browsers

【讨论】:

    【解决方案4】:

    你可以用 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);
        });
    

    【讨论】:

      【解决方案5】:

      尝试从Removing duplicates from an Array(simple)关注:

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

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

      【讨论】:

      • 这个函数不只是删除重复,它也排序。为什么要用这样一个特定的函数来阻碍 Array 的原型(这对任何类型的数组都不起作用,因为大多数都不能直接排序)?
      • 也许更好地测试不平等并处理continue
      • @Matanya 我正在改进我的答案
      • @thg435 我在第一个代码中出现了{ 的简单错误,这就是它无法正常工作的原因,现在已更正并经过测试。
      猜你喜欢
      • 2011-07-03
      • 2017-03-21
      • 2020-05-08
      • 2010-10-13
      • 1970-01-01
      • 2011-03-22
      相关资源
      最近更新 更多