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 相关文章推荐
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
Aug 28 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
Jun 17 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
May 27 Javascript
JavaScript中闭包的写法和作用详解
Jun 29 Javascript
原生JS查找元素的方法(推荐)
Nov 22 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
Dec 13 Javascript
AngularJS $http模块POST请求实现
Apr 08 Javascript
使用Dropzone.js上传的示例代码
Oct 10 Javascript
laydate如何根据开始时间或者结束时间限制范围
Nov 15 Javascript
vue-week-picker实现支持按周切换的日历
Jun 26 Javascript
three.js利用射线Raycaster进行碰撞检测
Mar 12 Javascript
vue-router定义元信息meta操作
Dec 07 Vue.js
将函数的实际参数转换成数组的方法
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
PHP字符串处理的10个简单方法
2010/06/30 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
Javascript面向对象编程
2012/03/18 Javascript
javascript中日期转换成时间戳的小例子
2013/03/21 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
2014/01/22 Javascript
JS控制输入框内字符串长度
2014/05/21 Javascript
js数组中如何随机取出一个值
2014/06/13 Javascript
让html页面不缓存js的实现方法
2014/10/31 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
以BootStrap Tab为例写一个前端组件
2017/07/25 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
vue表单自定义校验规则介绍
2018/08/28 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
利用Python爬取可用的代理IP
2016/08/18 Python
python通过实例讲解反射机制
2019/10/17 Python
Python函数的迭代器与生成器的示例代码
2020/06/18 Python
python 星号(*)的多种用途
2020/09/21 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
幼儿园中班下学期评语
2014/04/18 职场文书
拾金不昧锦旗标语
2014/06/27 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python
MySQL的Query Cache图文详解
2021/07/01 MySQL