js 巧妙去除数组中的重复项


Posted in Javascript onJanuary 25, 2010

时不时的看下YUI的源码, 总会有些收获.

一. YUI中的源码'

var toObject = function(a) { 
var o = {}; 
for (var i=0, j=a.length; i<j; i=i+1) { // 这里我调整了下, YUI源码中是i<a.length 
o[a[i]] = true; 
} 
return o; 
}; 
var keys = function(o) { 
var a=[], i; 
for (i in o) { 
if (o.hasOwnProperty(i)) { // 这里, YUI源码中是lang.hasOwnProperty(o, i) 
a.push(i); 
} 
} 
return a; 
}; 
var uniq = function(a) { 
return keys(toObject(a)); 
};

注:为了书写方便, 我省略了各方法前的类名, 大伙可自行查阅YUI的源码, 2.7.0b与2.8.0r4均可(此部分的代码是一样的).

二. 该方法的思路
1. 先以目标数组的值为key生成一个对象. 这一步是最核心的: 因为在一个对象中, key是无法重复的, 这样就很巧妙的排除了重复值;

2. 遍历生成的对象, 将这些key取出来放到一个数组中, OK, 到此就大功告成了!(简单吧, 只需两步就行)

三. 该方法的特点
1. 对于该方法, 不论数组有多少项, 都只会遍历两次, 在性能上的优势较明显(想想自己以前的做法: 对数组项进行逐个对比, 其性能之差, 可想而知).

2. 经我的测试, 该方法只适用于数组项为字符串, 数字的一维数组(我觉得, 对多维数组进行排除重复项的操作, 实在是太杯具了!).

其它的方法可以参考上一篇文章。

Javascript 相关文章推荐
javascript 写类方式之六
Jul 05 Javascript
中文路径导致unitpngfix.js不正常的解决方法
Jun 26 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
Jun 09 Javascript
JS实现从表格中动态删除指定行的方法
Mar 31 Javascript
Javascript函数式编程简单介绍
Oct 11 Javascript
Node.js使用Express创建Web项目详细教程
Mar 31 Javascript
最新Javascript程序员面试试题和解题方法
Nov 23 Javascript
解析vue中的$mount
Dec 21 Javascript
JS和Canvas实现图片的预览压缩和上传功能
Mar 30 Javascript
JS实现的简单折叠展开动画效果示例
Apr 28 Javascript
Vue2.0生命周期的理解
Aug 20 Javascript
Vue路由history模式解决404问题的几种方法
Sep 29 Javascript
将函数的实际参数转换成数组的方法
Jan 25 #Javascript
javascript中利用数组实现的循环队列代码
Jan 24 #Javascript
document.getElementById为空或不是对象的解决方法
Jan 24 #Javascript
JavaScript 未结束的字符串常量常见解决方法
Jan 24 #Javascript
php gethostbyname获取域名ip地址函数详解
Jan 24 #Javascript
setTimeout与setInterval在不同浏览器下的差异
Jan 24 #Javascript
js 模拟实现类似c#下的hashtable的简单功能代码
Jan 24 #Javascript
You might like
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
phpStorm2020 注册码
2020/09/17 PHP
node.js中的path.resolve方法使用说明
2014/12/08 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
python动态加载变量示例分享
2014/02/17 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
Numpy 多维数据数组的实现
2020/06/18 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
帕克纽约:PARKER NY
2018/12/09 全球购物
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
乒乓球兴趣小组活动总结
2014/07/08 职场文书
工作检讨书怎么写
2015/01/23 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书