从数组中删除重复元素[重复]

Posted

技术标签:

【中文标题】从数组中删除重复元素[重复]【英文标题】: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。 【参考方案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 我正在改进我的答案 ***.com/q/9229645/989121 @thg435 我在第一个代码中出现了 的简单错误,这就是它无法正常工作的原因,现在已更正并经过测试。

以上是关于从数组中删除重复元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从数组中删除元素(Java)[重复]

如何从数组中删除所有元素[重复]

从分解的字符串中删除空数组元素[重复]

如何从js中的数组中删除元素[元素来自mongodb] [重复]

如何从js中的数组中删除元素[元素来自mongodb] [重复]

不使用 pop() 从数组中删除最后一个元素 [重复]