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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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

2006-11-17 10:55:19 来源: 天极网

数组是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 )遍历。 

js数组去重效率——Map,Set是最高的吗 这篇文章初衷是想探索去重效率,真的是Map,Set最高?实际开发中用哪些最快? 我一次性写好下面的测试数据方法(可粘贴后在Node环境直接跑) 测试结果 结论:unique,uniqueBySet,uniqueByMap是值得推荐使用的。 10万级别结果: 过程:测试了三组数据(防止样本重复不足的偏差) 结论:个人习惯用的自定义 unique方法(原理是hash+reduce)基本Set,Ma... 阅读详情

相关推荐

js 中 Map/Set 集合

Map Map是一组键值对的结构,具有极快的查找速度。 举个例子,假设要根据同学的名字查找对应的成绩,如果用Array实现,需要两个Array: 1 var names = ['Michael', 'Bob', 'Tracy']; 2 var scores = [95, 75, 85]; 给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从sco...

diaolianxian9049的博客 307

js性能优化之 Object/Array直接量

以前可能自己写的时候也有这个习惯,但是理论性的没有认真去中总结过。   简单记录,加深理解。   我们一定有场景去会创建对象或者数组,也有各种方法去实现。 但是最快最好的是什么? -----------使用直接量或者有的说的对象数组字面量     1. 对象字面量      -------创建新对象值的表示法。一个对象字面量就是包围在一对花括号中零或者多个“名...

Focus-Fe 372

JS集合对象(Array、Map、Set)及类数组对象的使用与对比

JS集合对象(Array、Map、Set)及类数组对象的使用与对比 在使用js编程的时候,常常会用到集合对象,集合对象其实是一种泛型,在js中没有明确的规定其内元素的类型,但在强类型语言譬如Java中泛型强制要求指定类型。 ES6引入了iterable类型,Array,Map,Set都属于iterable类型,它们可以使用for...of循环来遍历,都内置forEach方法。 数组...

sqLeiQ的博客 2220

昨天去海龙给电脑升级

升级配置:CPU AMD 闪龙2400内存 512*2主板 微星 NF2机箱 富士康键盘 NEC鼠标 SONY 光电总开销没超过2000元最莫名其妙的是这块板子就是点不亮2600,巨郁闷。5101柜台的阿姨跑上跑下忙活,左邻右舍都过来帮忙,终于也没点亮。最后拿2400凑合了。技术说:不应该啊。我说:得了,就是他吧,等你把2600点亮,天就黑了。终于,当我们抱着主机箱走出海龙时,天已经黑了,2600

civ3的自习室 1236

中关村海龙大厦-买本上当经历给大家提个醒

昨天去中关村海龙大厦,买个笔记本我我哥们儿两个。 到哪里就被忽悠到了9层的一间房里,说是什么联想提货中心,本来是奔联想V470去的 到那之后,前面就要了几个参数 V470 4G内存 500G硬盘(因为之前有个同学买的这个V470 64位 750G硬盘 5400买的,一年前了, 我们也就没多想),然后那个销售就说4300,感觉不贵。我哥们儿也是个爽快人就直接付款了 ,然后我也就跟着付了款。(这时候...

weixin_30679823的博客 197

Ubuntu电脑现身中关村

<!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } H1 { margin-bottom: 0.21cm } H1.western { font-family: "AR PL UMing CN", serif } H1.cjk { font

袁萌专栏 2483

Ubuntu 12.04今天就要发布了,还有什么话要说的?

<!-- @page {margin:2cm} p {margin-bottom:0.21cm} -->        人们对Ubuntu 12.04这个版本的期望很高,因此,也难免有人为其担心。有人说,她是天使;也有人说,她是恶魔。我们应该怎么看呢?        刚才,我在一个“Hacker News”(“黑客新闻””)栏目里面,读了一篇黑客争吵文章,题为“Ubu

袁萌专栏 2617

JS中对集合数组的操作

http://baike.xsoftlab.net/view/544.html

itdragons的博客 6693

Dictionary数组查找效率对比

今天想到前两天的通用数据库访问实体类中,想到了赋值取值的效率,于是今天就写了个小程序测试了额一下 测试程序代码: int Count = 1000000; string findName = "Field" + (Count-1).ToString(); DataEntity[] _ArrTestStr = new DataEn...

weixin_34367845的博客 2008

三大类list的效率比较---1.

先说下我所认为的程序员素养吧,我认为应包括以下几个方面呢:1,扎实的功底——扎实掌握操作系统,数据结构等大学基本课程,鼓吹基础无用论的,必定是个三流程序员。2,学习心态——对你所调用的,一定要有好奇心,尽可能花时间去了解API背后的东西,去了解系统框架是如何运作;对新的领域,一定要有好奇心,多尝试多学习,他山之石,可以攻玉。3,善于自学、总结、发问——工作后没有人去手把手教你,只要自己刻苦专研,并

Sanjay的专栏 1627

js数组与对象性能比较

js数组可以看成特殊的对象,获取指定项的行为跟获取对象中指定key对应项的行为是一致的。 一般都是hash map实现的,因而复杂度是常数级的。 转载于:https://www.cnblogs.com/zhongzihao/p/5971403.html...

weixin_30627381的博客 727

利用apply提高编程效率的方法总结

合理的使用apply/call函数能够帮助我们极大地简化代码,高效地解决问题。本文尝试总结apply方法的几种用法,并发现规律,以便在需要时能够想到该方法。因applycall方法的用法几乎相同,差别仅在于参数的传入方法,故本文仅以apply方法为例。 方法介绍 apply是函数对象原型的一个方法(Function.prototype.apply),它能够改变函数在运行时的this指向,即,能够...

weixin_34387468的博客 352

js数组--集合

数组-集合 一个标识符,可以存储多个数据,数据不能重复。 集合-Set (去重) Set里面不会出现重复的数据,一旦往内添加数据时,Set内是有的,它自动就不会往内添加 集合赋值 标识符 . add 集合数组的区别 集合的内容具有唯一性(全等匹配) 声明集合 构造函数 let F70 = new Set(F71); 集合的方法属性 .size 属性size 书写格式: 集合.size 功能:输出集合存储数据的个数 例: let F70 = new Set ( [1, 2, 3] )

weixin_49702294的博客 653

js数组去重方法以及其效率总结

主要是针对一些常用的数组去重方法以及这些方法需要消耗的时间。 测试用的数组是百万级别的,下面是创建测试数组的方法: let arr = []; for(let i = 0; i &lt; 1000000;i ++) { arr.push(Math.floor(1000000* Math.random())) } 使用console.time('test')console.tim...

xinyiyukenan的博客 3638
上一篇: 一个优秀的超链接鼠标悬停提示CSS+JS
下一篇: 网站生成静态页面
SmartJavaer
博客等级 码龄20年 13粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值