解决遍历时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 相关文章推荐
基于jquery的让页面控件不可用的实现代码
Apr 27 Javascript
JavaScript中valueOf函数与toString方法深入理解
Dec 02 Javascript
JS选项卡动态替换banner图片路径的方法
May 11 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
Oct 12 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
May 14 Javascript
JavaScript排序算法动画演示效果的实现方法
Oct 18 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
Oct 28 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
Nov 07 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
Jun 04 Javascript
React Native之TextInput组件解析示例
Aug 22 Javascript
在 webpack 中使用 ECharts的实例详解
Feb 05 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
May 15 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开发大型项目的一点经验
2006/10/09 PHP
php二维数组排序详解
2013/11/06 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
php表单处理操作
2017/11/16 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
JavaScript 模拟用户单击事件
2009/12/31 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
简单说明Python中的装饰器的用法
2015/04/24 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
python多进程实现进程间通信实例
2017/11/24 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
Python 常用模块 re 使用方法详解
2019/06/06 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
飘柔洗发水广告词
2014/03/14 职场文书
中学生评语大全
2014/04/18 职场文书
金融与证券专业求职信
2014/06/22 职场文书
会计系毕业求职信
2014/08/07 职场文书
最新离婚协议书范本
2014/08/19 职场文书
护士工作失误检讨书
2014/09/14 职场文书
民事起诉状范文
2015/05/19 职场文书
化工厂员工工作总结
2015/10/15 职场文书
2016猴年春节慰问信
2015/11/30 职场文书
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript
pytorch中[..., 0]的用法说明
2021/05/20 Python
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
2021/08/23 HTML / CSS