traversal_javascript 스킬 중 Array.indexOf로 인해 발생하는 성능 문제 해결

WBOY
풀어 주다: 2016-05-16 17:52:04
원래의
1085명이 탐색했습니다.
코드 복사 코드는 다음과 같습니다.

Ext.applyIf(Array.prototype, {
/**
* 지정한 객체가 배열에 존재하는지 확인합니다.
* @param {Object} o 확인할 개체
* @param {Number} from (선택 사항) 검색을 시작할 인덱스
* @return {Number} o의 인덱스 배열(또는 찾을 수 없는 경우 -1)
*/
indexOf: function(o, from){
var len = this.length
from = from || 0
from = (for (; from < len; from){
if(this[from] === o){
return from
} ;
return -1;
}

소스 코드에서 볼 수 있듯이 검색은 간단한 선형 검색입니다.
선형 검색 효율은 O(n)이므로 데이터의 양이 조금 더 커지면 Array에 대한 대안을 찾아야 합니다. "The Definitive Guide"를 포함하여 Array의 이 문제에 대한 많은 기사가 있습니다. 이 방법은 해시 테이블을 시뮬레이션하는 것입니다.
다음은 문제가 되는 코드입니다

코드를 복사하세요 코드는 다음과 같습니다
var 호스트IP = [];
Ext.each(_this.hosts,function(item){
hostsIP.push(item.ip);
})
Ext.each(txtHostsIP, function(ip) {
if(hostsIP.indexOf(ip)===-1){//문제 코드
var 호스트 = {
isAppend: true,//새 호스트
isAgentOk: false,
ip : ip
};
_this.hosts.push(
Ext.apply(host,_this.MAPPING_FIELDS)
); }else {
errors.push('IP[' ip '] 이미 존재함');
}
})


hostsIP 길이가 2000을 초과하는 경우, IE8- 찾아보기 장치에 다음 메시지가 표시됩니다


"The Definitive Guide"에 제공된 팁에 따라 코드를 다음과 같이 수정하여 문제가 해결되었습니다.


코드 복사 코드는 다음과 같습니다. varhostIP = {}; Ext.each (_this.hosts,function(item){
hostsIP[item.ip]=item.ip;
})

Ext.each(txtHostsIP,function(ip){
if(!hostsIP.hasOwnProperty(ip)){
var 호스트 = {
isAppend : true,//새 호스트
isAgentOk : false,
ip : ip
};
_this.hosts.push(
Ext.apply(host,_this.MAPPING_FIELDS)
)
isAppend =
}else{
errors.push('IP[ 'ip']이미 존재함');
}
});
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿