数组是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中的集合及其检索效率相关推荐

  1. JavaScript中数组的几种写法

    1.直接new一个数组,不指定数组长度,使用数组下标给数组赋值,数组中可以存放任意类型的数据.(遍历时未赋值的元素将会显示undefined): <!DOCTYPE html> <h ...

  2. 谈谈JavaScript中的数组、集合及效率

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

  3. Javascript中的陷阱大集合【译】

    参考:http://www.2cto.com/kf/201111/111203.html 昨天晚上在自己的个人技术博客上翻译了一篇有关Javascript的文章,今天想想还是把它投稿到博客园吧,大家可 ...

  4. set集合判断集合中是否有无元素_一文了解 JavaScript 中的 Set(集合)- 对 Set 的扩展...

    阅读全文需要 4 分钟.主要介绍对 ES6 中的 Set 集合方法的扩展.阅读本文后,你能创建出对 Set 方法扩展,并且结合下期内容,将其发布到 NPM 中. 往期回顾 一文了解 JavaScrip ...

  5. 遍历JavaScript中的数组

    在Java中,可以使用for循环遍历数组中的对象,如下所示: String[] myStringArray = {"Hello", "World"}; for ...

  6. 在Javascript中实现伪哈希表

    了解数据结构的人应该都听说过哈希表这种数据结构,它是一种典型的利用键值对存储并检索数据的一种非线性结构,又称散列表或杂凑法.在一般的线性表结构中,数据的相对位置是随机的,即数据和用于检索的关键字之间不 ...

  7. JavaScript基础笔记集合(转)

    JavaScript基础笔记集合 JavaScript基础笔记集合   js简介 js是脚本语言.浏览器是逐行的读取代码,而传统编程会在执行前进行编译   js存放的位置 html脚本必须放在< ...

  8. 52 JavaScript中的正则表达式

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.什么是正则表达式 正则表达是(regular expression)是用于匹配字符串中 ...

  9. 在JavaScript中逐个遍历数组?

    如何使用JavaScript遍历数组中的所有条目? 我以为是这样的: forEach(instance in theArray) 其中theArray是我的数组,但这似乎是不正确的. #1楼 如果您不 ...

  10. JavaScript中的私有成员

    JavaScript中的私有成员 Douglas Crockford www.crockford.com 翻译:ShiningRay @ Nirvana Studio JavaScript 是世界上最 ...

最新文章

  1. idea解决@Data注解报红问题
  2. 初学Java对某些问题的理解
  3. 每个程序员都应该了解的内存知识【第一部分】
  4. 牛客题霸 [合并两个有序的数组] C++题解/答案
  5. 结对编程 - 马尔科夫链
  6. C#转C++的一点分享
  7. 如何通过虚拟私有云保障服务安全【华为云分享】
  8. 17个可以节省你时间的CSS工具
  9. [原创]如何培养孩子的自信
  10. android对象缓存,【Android教程】缓存对象中的顶点数组和数据索引
  11. 《精通软件性能测试与LoadRunner最佳实战》—第1章1.5节软件开发与软件测试的关系...
  12. 电脑常用音频剪辑软件_常用手机视频剪辑软件
  13. 小菜找实习-动态规划
  14. vue style.css,vue * !!vue-style-loader!css-loader?
  15. excel数据库_如何通过INTOUCH组态软件做EXCEL报表(含代码)
  16. 快捷键Ctrl+s快速保存,屏蔽保存网页到本地
  17. 关于TikTok环境伪装度检测,whoer和上网大师app的对比
  18. RGB、HSL、Hex网页色彩,看完这篇全懂了
  19. 昨天见到了原来飘渺水云间(浙江大学BBS站)的FLASH版主小兵甲
  20. webgl中顶点着色器的varying变量,使用方法。

热门文章

  1. 【VRP】基于matlab蚁群算法求解多中心的车辆路径规划问题【含Matlab源码 111期】
  2. 部署容器jenkins_使用Jenkins部署用于进行头盔检测的烧瓶容器
  3. Scrapy实战,利用Scrapy简单爬取新闻并将内容储存
  4. java类加载配置文件_如何在java类中读取Properties配置文件
  5. 你确认退出吗 html,按退出会 执行2次弹出确认窗口,为何?
  6. win2012故障转移mysql集群_Windows下SQLSERVER故障转移集群案例
  7. Python删除文件中含有特定值的行
  8. ajax获得远程html,select2通过AJAX获取远程数据的方法
  9. 小程序反编译 g is not defined_阅读技巧 | 如何猜中作者的小心思?
  10. topcoder srm 440 div1