当前位置:  开发笔记 > 编程语言 > 正文

获取JavaScript数组中的所有唯一值(删除重复项)

如何解决《获取JavaScript数组中的所有唯一值(删除重复项)》经验,为你挑选了29个好方法。

我有一系列数字,我需要确保它们是唯一的.我在互联网上找到了下面的代码片段,它的工作情况很好,直到数组中的数字为零.我发现这个其他脚本在SO上看起来几乎就像它,但它不会失败.

所以为了帮助我学习,有人可以帮我确定原型脚本出错的地方吗?

Array.prototype.getUnique = function() {
 var o = {}, a = [], i, e;
 for (i = 0; e = this[i]; i++) {o[e] = 1};
 for (e in o) {a.push (e)};
 return a;
}

重复问题的更多答案:

从JavaScript数组中删除重复项

类似的问题:

在数组中获取具有多个匹配项的所有值(即:不唯一)

TLindig.. 2321

使用JavaScript 1.6/ECMAScript 5,您可以通过filter以下方式使用Array 的本机方法来获取具有唯一值的数组:

function onlyUnique(value, index, self) { 
    return self.indexOf(value) === index;
}

// usage example:
var a = ['a', 1, 'a', 2, '1'];
var unique = a.filter( onlyUnique ); // returns ['a', 1, 2, '1']

本机方法filter将循环遍历数组,只留下那些通过给定回调函数的条目onlyUnique.

onlyUnique检查,如果给定的值是第一次发生.如果没有,则必须是重复的,不会被复制.

此解决方案无需任何额外的库,如jQuery或prototype.js.

它适用于具有混合值类型的数组.

对于旧浏览器(filter,indexOf您可以在MDN文档中找到filter和indexOf的解决方法.

如果要保留最后一次出现的值,请简单替换indexOflastIndexOf.

使用ES6可以缩短到这个:

// usage example:
var myArray = ['a', 1, 'a', 2, '1'];
var unique = myArray.filter((v, i, a) => a.indexOf(v) === i); 

// unique is ['a', 1, 2, '1']

感谢Camilo Martin的评论提示.

ES6有一个本机对象Set来存储唯一值.要获得具有唯一值的数组,您现在可以执行以下操作:

var myArray = ['a', 1, 'a', 2, '1'];

let unique = [...new Set(myArray)]; 

// unique is ['a', 1, 2, '1']

Set获取可迭代对象(如Array)的构造函数,以及扩展运算符...将该集转换回Array.感谢Lukas Liese的评论提示.



1> TLindig..:

使用JavaScript 1.6/ECMAScript 5,您可以通过filter以下方式使用Array 的本机方法来获取具有唯一值的数组:

function onlyUnique(value, index, self) { 
    return self.indexOf(value) === index;
}

// usage example:
var a = ['a', 1, 'a', 2, '1'];
var unique = a.filter( onlyUnique ); // returns ['a', 1, 2, '1']

本机方法filter将循环遍历数组,只留下那些通过给定回调函数的条目onlyUnique.

onlyUnique检查,如果给定的值是第一次发生.如果没有,则必须是重复的,不会被复制.

此解决方案无需任何额外的库,如jQuery或prototype.js.

它适用于具有混合值类型的数组.

对于旧浏览器(filter,indexOf您可以在MDN文档中找到filter和indexOf的解决方法.

如果要保留最后一次出现的值,请简单替换indexOflastIndexOf.

使用ES6可以缩短到这个:

// usage example:
var myArray = ['a', 1, 'a', 2, '1'];
var unique = myArray.filter((v, i, a) => a.indexOf(v) === i); 

// unique is ['a', 1, 2, '1']

感谢Camilo Martin的评论提示.

ES6有一个本机对象Set来存储唯一值.要获得具有唯一值的数组,您现在可以执行以下操作:

var myArray = ['a', 1, 'a', 2, '1'];

let unique = [...new Set(myArray)]; 

// unique is ['a', 1, 2, '1']

Set获取可迭代对象(如Array)的构造函数,以及扩展运算符...将该集转换回Array.感谢Lukas Liese的评论提示.


`let unique_values = [... new Set(random_array)];`https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
不幸的是,这个解决方案运行得慢得多.你循环两次,一次使用过滤器,一次使用索引
在现代JS中:`.filter((v,i,a)=> a.indexOf(v)== i)`(胖箭头符号).
@JackFranzen比什么慢?来自_Rafael_的解决方案?_Rafaels_解决方案不适用于混合类型数组.对于我的例子`['a',1,'a',2,'1']`你会得到`['a',1,2]`.但这不是我的预期.顺便说一句,慢得多是非常相对的.
有关更详细的答案,包括许多可能性 - 例如排序优先,以及处理不同的数据类型 - 请参阅http://stackoverflow.com/a/9229821/368896
@BradGreens。由于TypeScript是强类型的,因此您无法进行这种黑客攻击。尝试`Array.from(new Set(myArray));`

2> A.T...:

更新了ES6/ES2015的答案:使用Set,单行解决方案是:

var items = [4,5,4,6,3,4,5,2,23,1,4,4,4]
var uniqueItems = Array.from(new Set(items))

哪个回报

[4, 5, 6, 3, 2, 23, 1]

正如le_m建议的那样,这也可以使用spread运算符缩短,比如

var uniqueItems = [...new Set(items)]


请注意,如果使用`Set`并添加对象而不是原始值,它将包含对象的唯一*引用*.因此,`let s = new Set([{Foo:"Bar"},{Foo:"Bar"}]);`中的集合`s`将返回:`Set {{Foo:'Bar'},{ Foo:'Bar'}}`这是一个`Set`,它包含对包含相同值的对象的唯一对象引用.如果你写'let o = {Foo:"Bar"};`然后创建一个带有两个*引用*的集合,如下所示:`let s2 = new Set([o,o]);`,那么s2将是`设置{{Foo:'Bar'}}`
请注意,内部数组不起作用`Array.from(new Set([[1,2],[1,2],[1,2,3]]))
与`myArray.filter((v,i,a)=> a.indexOf(v)=== i);'相比,该解决方案的性能如何?
新的测试用例https://jsperf.com/array-filter-unique-vs-new-set/1似乎是“ new Set”的奖杯

3> Max Makhrov..:

我意识到这个问题已有30多个答案.但我先阅读了所有现有的答案并进行了自己的研究.

我将所有答案分成4个可能的解决方案:

    使用新的ES6功能: [...new Set( [1, 1, 2] )];

    使用对象{ }来防止重复

    使用辅助数组 [ ]

    使用 filter + indexOf

以下是答案中的示例代码:

使用新的ES6功能: [...new Set( [1, 1, 2] )];
function uniqueArray0(array) {
  var result = Array.from(new Set(array));
  return result    
}
使用对象{ }来防止重复
function uniqueArray1( ar ) {
  var j = {};

  ar.forEach( function(v) {
    j[v+ '::' + typeof v] = v;
  });

  return Object.keys(j).map(function(v){
    return j[v];
  });
} 
使用辅助数组 [ ]
function uniqueArray2(arr) {
    var a = [];
    for (var i=0, l=arr.length; i

使用 filter + indexOf

function uniqueArray3(a) {
  function onlyUnique(value, index, self) { 
      return self.indexOf(value) === index;
  }

  // usage
  var unique = a.filter( onlyUnique ); // returns ['a', 1, 2, '1']

  return unique;
}

我想知道哪一个更快.我已经制作了样本Google表格以测试功能.注意:ECMA 6在Google表格中不可用,因此我无法对其进行测试.

这是测试的结果: 在此输入图像描述

我希望看到使用object的代码{ }会赢,因为它使用hash.所以我很高兴测试在Chrome和IE中显示了该算法的最佳结果.感谢@rab 代码.


@ fletchsod,数字是运行代码的时间(以毫秒为单位)。

4> kornfridge..:

您也可以使用underscore.js.

console.log(_.uniq([1, 2, 1, 3, 1, 4]));





















    
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有