解決遍歷時(shí)Array.indexOf產(chǎn)生的性能問(wèn)題
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;
}
從源碼可以看出,查找是簡(jiǎn)單的線性查找。
由于線性查找效率是 O(n) ,所以,在數(shù)據(jù)量稍大的時(shí)候,需要尋找替代 Array 的辦法。有很多文章說(shuō)過(guò)關(guān)于 Array 的這個(gè)問(wèn)題,包括《權(quán)威指南》,辦法是模擬一個(gè) Hash 表。
下面是有問(wèn)題的代碼
var hostsIP = [];
Ext.each(_this.hosts,function(item){
hostsIP.push(item.ip);
});
Ext.each(txtHostsIP,function(ip){
if(hostsIP.indexOf(ip)===-1){//問(wèn)題代碼
var host = {
isAppend : true,//新增的主機(jī)
isAgentOk : false,
ip : ip
};
_this.hosts.push(
Ext.apply(host,_this.MAPPING_FIELDS)
);
isAppend = true;
}else{
errors.push('IP['+ip+']已存在');
}
});
當(dāng)hostsIP長(zhǎng)度超過(guò)2000個(gè)時(shí),IE8-瀏覽器會(huì)出現(xiàn)如下提示
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,//新增的主機(jī)
isAgentOk : false,
ip : ip
};
_this.hosts.push(
Ext.apply(host,_this.MAPPING_FIELDS)
);
isAppend = true;
}else{
errors.push('IP['+ip+']已存在');
}
});
- 詳談js遍歷集合(Array,Map,Set)
- Java中ArrayList和LinkedList的遍歷與性能分析
- jQuery篩選數(shù)組之grep、each、inArray、map的用法及遍歷json對(duì)象
- C#常見(jiàn)的幾種集合 ArrayList,Hashtable,List<T>,Dictionary<K,V> 遍歷方法對(duì)比
- JavaScript中循環(huán)遍歷Array與Map的方法小結(jié)
- java arrayList遍歷的四種方法及Java中ArrayList類的用法
- java使用ArrayList遍歷及效率比較實(shí)例分析
- 數(shù)組Array進(jìn)行原型prototype擴(kuò)展后帶來(lái)的for in遍歷問(wèn)題
- flex array 搜索 遍歷
- js中Array對(duì)象的常用遍歷方法詳解
相關(guān)文章
js腳本實(shí)現(xiàn)數(shù)據(jù)去重
最近在一個(gè)項(xiàng)目中,需要去除掉重復(fù)的數(shù)據(jù),之前都是在后臺(tái)實(shí)現(xiàn),現(xiàn)在客戶需求是在前臺(tái)去重,于是就想到了javascript腳本。2014-11-11Javascript實(shí)現(xiàn)關(guān)聯(lián)數(shù)據(jù)(Linked Data)查詢及注意細(xì)節(jié)
DBpedia對(duì)Wikipedia的數(shù)據(jù)變成Linked Data形式,使得機(jī)器也能讀懂并自由獲得這些數(shù)據(jù);本文的主要目的是利用Javascript從DBpedia中獲取我們想要的數(shù)據(jù),感興趣的朋友可以參考下,希望可以幫助到你2013-02-02純Javascript實(shí)現(xiàn)ping功能的方法
這篇文章主要介紹了純Javascript實(shí)現(xiàn)ping功能的方法,實(shí)例分析了javascript實(shí)現(xiàn)ping功能的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03javascript+html5+css3自定義彈出窗口效果
這篇文章主要為大家詳細(xì)介紹了javascript+html5+css3自定義彈出窗口效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10JavaScript?canvas?實(shí)現(xiàn)用代碼畫(huà)畫(huà)
這篇文章主要為大家介紹了JavaScript?canvas?實(shí)現(xiàn)用代碼畫(huà)畫(huà)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11JavaScript實(shí)現(xiàn)帶播放列表的音樂(lè)播放器實(shí)例分享
這篇文章主要介紹了JavaScript實(shí)現(xiàn)帶播放列表的音樂(lè)播放器實(shí)例分享,包括對(duì)播放完歌單之后沒(méi)有將要播放的歌曲的提示功能,需要的朋友可以參考下2016-03-03ES6新特性六:promise對(duì)象實(shí)例詳解
這篇文章主要介紹了ES6新特性之promise對(duì)象,結(jié)合實(shí)例形式詳細(xì)分析了promise對(duì)象的功能、狀態(tài)、使用方法與相關(guān)操作技巧,需要的朋友可以參考下2017-04-04JS實(shí)現(xiàn)購(gòu)物車中商品總價(jià)計(jì)算
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)購(gòu)物車中商品總價(jià)的計(jì)算 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03