解决遍历时Array.indexOf产生的性能问题


Posted in Javascript onJuly 03, 2012
Ext.applyIf(Array.prototype, { 
/** 
* Checks whether or not the specified object exists in the array. 
* @param {Object} o The object to check for 
* @param {Number} from (Optional) The index at which to begin the search 
* @return {Number} The index of o in the array (or -1 if it is not found) 
*/ 
indexOf : function(o, from){ 
var len = this.length; 
from = from || 0; 
from += (from < 0) ? len : 0; 
for (; from < len; ++from){ 
if(this[from] === o){ 
return from; 
} 
}); 
return -1; 
}

从源码可以看出,查找是简单的线性查找。
由于线性查找效率是 O(n) ,所以,在数据量稍大的时候,需要寻找替代 Array 的办法。有很多文章说过关于 Array 的这个问题,包括《权威指南》,办法是模拟一个 Hash 表。
下面是有问题的代码
var hostsIP = []; 
Ext.each(_this.hosts,function(item){ 
hostsIP.push(item.ip); 
}); 
Ext.each(txtHostsIP,function(ip){ 
if(hostsIP.indexOf(ip)===-1){//问题代码 
var host = { 
isAppend : true,//新增的主机 
isAgentOk : false, 
ip : ip 
}; 
_this.hosts.push( 
Ext.apply(host,_this.MAPPING_FIELDS) 
); 
isAppend = true; 
}else{ 
errors.push('IP['+ip+']已存在'); 
} 
});

当hostsIP长度超过2000个时,IE8-浏览器会出现如下提示

解决遍历时Array.indexOf产生的性能问题

按照《权威指南》中给出的提示,我对代码做了如下修改后,问题解决。
var hostsIP = {}; 
Ext.each(_this.hosts,function(item){ 
hostsIP[item.ip]=item.ip; 
}); Ext.each(txtHostsIP,function(ip){ 
if(!hostsIP.hasOwnProperty(ip)){ 
var host = { 
isAppend : true,//新增的主机 
isAgentOk : false, 
ip : ip 
}; 
_this.hosts.push( 
Ext.apply(host,_this.MAPPING_FIELDS) 
); 
isAppend = true; 
}else{ 
errors.push('IP['+ip+']已存在'); 
} 
});
Javascript 相关文章推荐
脚本吧 - 幻宇工作室用到js,超强推荐base.js
Dec 23 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
Dec 30 Javascript
jquery绑定原理 简单解析与实现代码分享
Sep 06 Javascript
jQuery实现TAB选项卡切换特效简单演示
Mar 04 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
May 03 Javascript
微信小程序中做用户登录与登录态维护的实现详解
May 17 Javascript
微信小程序网络请求wx.request详解及实例
May 18 Javascript
小程序自定义组件实现城市选择功能
Jul 18 Javascript
JS+CSS3实现的简易钟表效果示例
Apr 13 Javascript
微信小程序实现同一页面取值的方法分析
Apr 30 Javascript
微信小程序实现pdf、word等格式文件上传的方法
Sep 10 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
Apr 14 Javascript
JavaScript中变量提升 Hoisting
Jul 03 #Javascript
JavaScript Scoping and Hoisting 翻译
Jul 03 #Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
Jul 03 #Javascript
jquery 实现表单验证功能代码(简洁)
Jul 03 #Javascript
JavaScript中的细节分析
Jun 30 #Javascript
JavaScript中的作用域链和闭包
Jun 30 #Javascript
JavaScript中的面向对象介绍
Jun 30 #Javascript
You might like
php读取数据库信息的几种方法
2008/05/24 PHP
PHP滚动日志的代码实现
2015/06/10 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
原生js写的放大镜效果
2012/08/22 Javascript
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
vue自定义一个v-model的实现代码
2018/06/21 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
用python删除java文件头上版权信息的方法
2014/07/31 Python
python通过socket查询whois的方法
2015/07/18 Python
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
python遍历文件夹找出文件夹后缀为py的文件方法
2018/10/21 Python
浅谈django url请求与数据库连接池的共享问题
2019/08/29 Python
使用IDLE的Python shell窗口实例详解
2019/11/19 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
汽修专业学生自我鉴定
2013/11/16 职场文书
文明班集体申报材料
2014/05/23 职场文书
农村党员对照检查材料
2014/09/24 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
2014年少先队工作总结
2014/12/03 职场文书
大学生实习介绍信
2015/05/05 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
导游词之南京栖霞山
2019/10/18 职场文书
pytorch实现手写数字图片识别
2021/05/20 Python
Python制作动态字符画的源码
2021/08/04 Python
基于Redis结合SpringBoot的秒杀案例详解
2021/10/05 Redis