解决遍历时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 相关文章推荐
JSON 入门指南 想了解json的朋友可以看下
Aug 26 Javascript
javascript 操作select下拉列表框的一点小经验
Mar 20 Javascript
CSS和Javascript简单复习资料
Jun 29 Javascript
JQuery中$之选择器用法介绍
Apr 05 Javascript
javascript生成随机颜色示例代码
May 05 Javascript
javascript中动态函数用法实例分析
May 14 Javascript
基于jquery实现无限级树形菜单
Mar 22 Javascript
ReactNative页面跳转实例代码
Sep 27 Javascript
jQuery  ready方法实现原理详解
Oct 19 Javascript
在vue中根据光标的显示与消失实现下拉列表
Sep 29 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
Oct 26 Javascript
Vue是怎么渲染template内的标签内容的
Jun 05 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统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
sql注入与转义的php函数代码
2013/06/17 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
PHP json_encode中文乱码问题的解决办法
2013/09/09 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
基于JQuery的动态删除Table表格的行和列的代码
2011/05/12 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
2017/03/08 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
pygame游戏之旅 python和pygame安装教程
2018/11/20 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
opencv与numpy的图像基本操作
2019/03/08 Python
详解Python做一个名片管理系统
2019/03/14 Python
Python Web版语音合成实例详解
2019/07/16 Python
Django 查询数据库并返回页面的例子
2019/08/12 Python
使用Python函数进行模块化的实现
2019/11/15 Python
Python实现非正太分布的异常值检测方式
2019/12/09 Python
Python短信轰炸的代码
2020/03/25 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
keras实现多种分类网络的方式
2020/06/11 Python
python开发入门——列表生成式
2020/09/03 Python
英国在线泳装店:Simply Swim
2019/05/05 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
《黄河颂》教学反思
2014/02/07 职场文书
欢送退休感言
2014/02/08 职场文书
学校安全责任书范本
2014/07/23 职场文书
公司租车协议书
2015/01/29 职场文书
联谊会开场白
2015/06/01 职场文书
公司中层管理培训心得体会
2016/01/11 职场文书