희망적으로 더 빠른 양방향 indexOf
/ lastIndexOf
대안
2015 년
새로운 메소드 include 는 매우 훌륭하지만, 현재는 기본적으로 지원이 없습니다.
느린 indexOf / lastIndexOf 함수를 대체하는 방법을 생각한 지 오래되었습니다.
가장 좋은 답변을 보면서 수행 가능한 방법이 이미 발견되었습니다. 그 contains
중에서 @Damir Zekic이 게시 한 기능 중 가장 빠른 기능을 선택했습니다 . 그러나 벤치 마크는 2008 년부터 시작되었으며 구식이기도합니다.
나는 또한 while
over 선호 for
하지만 특별한 이유는 없기 때문에 for 루프로 함수 작성을 종료했습니다. 또한로 수행 할 수 있습니다 while --
.
배열을 수행하는 동안 배열의 양쪽을 확인하면 반복이 훨씬 느리면 궁금했습니다. 분명히 아니요. 따라서이 기능은 가장 많이 뽑힌 투표보다 2 배 정도 빠릅니다. 분명히 그것은 또한 네이티브보다 빠릅니다. 실제 환경에서 검색하는 값이 배열의 시작 또는 끝에 있는지 알 수없는 환경입니다.
방금 값을 가진 배열을 푸시했다는 것을 알면 lastIndexOf를 사용하는 것이 가장 좋은 해결책 일 수 있지만 큰 배열을 통과해야하고 결과가 어디에나있을 수있는 경우 상황을 더 빠르게 만드는 견고한 솔루션 일 수 있습니다.
양방향 indexOf / lastIndexOf
function bidirectionalIndexOf(a, b, c, d, e){
for(c=a.length,d=c*1; c--; ){
if(a[c]==b) return c; //or this[c]===b
if(a[e=d-1-c]==b) return e; //or a[e=d-1-c]===b
}
return -1
}
//Usage
bidirectionalIndexOf(array,'value');
성능 테스트
http://jsperf.com/bidirectionalindexof
테스트로 100k 항목으로 배열을 만들었습니다.
세 가지 쿼리 : 배열의 시작, 중간 및 끝.
이 내용이 흥미롭고 성능을 테스트하기를 바랍니다.
참고 : 나는 약간 수정 된 알 수 있듯이 contains
(그래서 기본적으로 같이 IndexOf 및 lastIndexOf에서도 출력을 반영하기 위해 기능을 true
로 index
와 false
함께 -1
). 그것은 해를 끼치 지 않아야합니다.
배열 프로토 타입 변형
Object.defineProperty(Array.prototype,'bidirectionalIndexOf',{value:function(b,c,d,e){
for(c=this.length,d=c*1; c--; ){
if(this[c]==b) return c; //or this[c]===b
if(this[e=d-1-c] == b) return e; //or this[e=d-1-c]===b
}
return -1
},writable:false, enumerable:false});
// Usage
array.bidirectionalIndexOf('value');
이 함수는 true 또는 false 또는 객체, 문자열 또는 그 밖의 것을 반환하도록 쉽게 수정할 수 있습니다.
그리고 여기 while
변형이 있습니다 :
function bidirectionalIndexOf(a, b, c, d){
c=a.length; d=c-1;
while(c--){
if(b===a[c]) return c;
if(b===a[d-c]) return d-c;
}
return c
}
// Usage
bidirectionalIndexOf(array,'value');
이것이 어떻게 가능한지?
배열에서 반사 인덱스를 얻는 간단한 계산은 너무 간단하여 실제 루프 반복을 수행하는 것보다 두 배 빠릅니다.
반복 당 세 번의 검사를 수행하는 복잡한 예는 다음과 같지만 계산 시간이 길어 코드가 느려지는 경우에만 가능합니다.
http://jsperf.com/bidirectionalindexof/2