我有一系列数字,我需要确保它们是唯一的.我在互联网上找到了下面的代码片段,它的工作情况很好,直到数组中的数字为零.我发现这个其他脚本在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.
它适用于具有混合值类型的数组.
对于旧浏览器(indexOf
您可以在MDN文档中找到filter和indexOf的解决方法.
如果要保留最后一次出现的值,请简单替换indexOf
为lastIndexOf
.
使用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的评论提示.
使用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.
它适用于具有混合值类型的数组.
对于旧浏览器(indexOf
您可以在MDN文档中找到filter和indexOf的解决方法.
如果要保留最后一次出现的值,请简单替换indexOf
为lastIndexOf
.
使用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的评论提示.
更新了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)]
我意识到这个问题已有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]));
Tags | 热门标签RankList | 热门文章
- 1与Android 6.0的Adb wifi连接
- 2控制isOpen in angular ui bootstrap
- 3新Azure门户中的"下载发布配置文件"在哪里?
- 4Prototype构造函数上下文中的JavaScript类型检查和异常?
- 5来自splm的乳胶回归表
- 6在OS X上将项目迁移到Xcode 7.2 El Capitan打破了构建
- 7iOS 9.2缺少常规设置中的配置文件部分
- 8docker:致命错误无法创建锁定文件:错误的文件描述符(9)
- 9ES6循环依赖
- 10如何创建在线SignalR服务器
- 11当你有一个额外的变量时,在R中循环以创建许多图
- 12xquery从外部xs:string变量(basex)插入节点
- 13Django 1.9:我应该避免在`django.setup()`中导入模型吗?
- 14如何遍历循环内的列表
- 15如何正确合并集合中模型的输出?
- 16将工作日志发布到JIRA时需要哪些字段?
- 17在服务Web和API的Rails应用程序中正确使用protect_from_forgery
- 18当项目有复选框时,RecyclerView项目不显示涟漪/触摸反馈
- 19如何避免使用太多容器破坏Docker?
- 20Haskell将(0/0)设置为qnan