从数组中删除重复元素[重复]
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 我在第一个代码中出现了
的简单错误,这就是它无法正常工作的原因,现在已更正并经过测试。以上是关于从数组中删除重复元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何从js中的数组中删除元素[元素来自mongodb] [重复]