JavaScript中的集合及效率


Posted in Javascript onJanuary 08, 2010

虽然这个集合的 key 只能是 String 类型,不像 Java 里面的各种集合类能够使用各种对象作为 Key ,但对于实现一般的客户端 JS 功能来说,已经是足够用了。同样,因为所有的 JS 内部对象都继承自 Object 对象,所以实际上 JS 的 Array 对象也可以使用字符串来做为数组的下标,就像 PHP 中的数组变量一样。来自鸟食轩。

数组是JavaScript提供的一个内部对象,它是一个标准的集合,我们可以添加(push)、删除(shift)里面元素,我们还可以通过for循环遍历里面的元素,那么除了数组我们在JavaScript里还可以有别的集合吗?

由于JavaScript的语言特性,我们可以向通用对象动态添加和删除属性。所以Object也可以看成是JS的一种特殊的集合。下面比较一下Array和Object的特性:

Array:

新建:var ary = new Array(); 或 var ary = [];
增加:ary.push(value);
删除:delete ary[n];
遍历:for ( var i=0 ; i < ary.length ; ++i ) ary[i];

Object:

新建:var obj = new Object(); 或 var obj = {};
增加:obj[key] = value; (key为string)
删除:delete obj[key];
遍历:for ( var key in obj ) obj[key];

从上面的比较可以看出Object完全可以作为一个集合来使用,在使用Popup窗口创建无限级Web页菜单(3)中我介绍过Eric实现的那个__MenuCache__,它也就是一个模拟的集合对象。

如果我们要在Array中检索出一个指定的值,我们需要遍历整个数组:

var keyword = ; 
for ( var i=0 ; i < ary.length ; ++i ) 
{ 
if ( ary[i] == keyword ) 
{ 
// todo 
} 
}

而我们在Object中检索一个指定的key的条目,只需要是要使用:

var key = '';
var value = obj[key];
// todo

Object的这个特性可以用来高效的检索Unique的字符串集合,遍历Array的时间复杂度是O(n),而遍历Object的时间复杂度是 O(1)。虽然对于10000次集合的for检索代价也就几十ms,可是如果是1000*1000次检索或更多,使用Object的优势一下就体现出来了。在此之前我做了一个mapping,把100个Unique的字符mapping到1000个字符串数组上,耗时25-30s!后来把for遍历改成了Object模拟的集合的成员引用,同样的数据量mapping,耗时仅1.7-2s!!!

对于集合的遍历效率(从高到低):var value = obj[key]; > for ( ; ; ) > for ( in )。效率最差的就是for( in )了,如果集合过大,尽量不要使用for ( in )遍历。

Javascript 相关文章推荐
js arguments.callee的应用代码
May 07 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
Sep 12 Javascript
jQuery右键菜单contextMenu使用实例
Sep 28 Javascript
JS获取节点的兄弟,父级,子级元素的方法
Jan 09 Javascript
js判断手机号是否正确并返回的实现代码
Jan 17 Javascript
EsLint入门学习教程
Feb 17 Javascript
JavaScript运动框架 多值运动(四)
May 18 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
Feb 12 jQuery
JS从非数组对象转数组的方法小结
Mar 26 Javascript
微信小程序 setData 对 data数据影响问题
Apr 18 Javascript
vue实现户籍管理系统
May 29 Javascript
vue自动添加浏览器兼容前后缀操作
Aug 13 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
Jan 08 #Javascript
Extjs学习笔记之八 继承和事件基础
Jan 08 #Javascript
Extjs学习笔记之七 布局
Jan 08 #Javascript
IE6下JS动态设置图片src地址问题
Jan 08 #Javascript
Javascript 中的类和闭包
Jan 08 #Javascript
Extjs学习笔记之六 面版
Jan 08 #Javascript
jQuery开发者都需要知道的5个小技巧
Jan 08 #Javascript
You might like
php数组查找函数总结
2014/11/18 PHP
PHP解析RSS的方法
2015/03/05 PHP
POST一个JSON格式的数据给Restful服务实例详解
2017/04/07 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
javascript的键盘控制事件说明
2008/04/15 Javascript
js 方法实现返回多个数据的代码
2009/04/30 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
js判断浏览器版本以及浏览器内核的方法
2015/01/20 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
Vue中fragment.js使用方法详解
2017/03/09 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
解决django同步数据库的时候app models表没有成功创建的问题
2019/08/09 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
大学生最常用的自我评价
2013/12/07 职场文书
质检部经理岗位职责
2014/02/19 职场文书
《雪地里的小画家》教学反思
2014/02/22 职场文书
工程材料采购方案
2014/05/18 职场文书
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS