가장 빠른 솔루션?
나는 몇 가지 벤치 마크를 실행 했으며이 솔루션은 크게 승리했습니다. 1
str.slice(str.indexOf(delim) + delim.length)
// as function
function gobbleStart(str, delim) {
return str.slice(str.indexOf(delim) + delim.length);
}
// as polyfill
String.prototype.gobbleStart = function(delim) {
return this.slice(this.indexOf(delim) + delim.length);
};
다른 솔루션과의 성능 비교
유일하게 가까운 경쟁자는 substr
대신 코드를 사용 하는 것을 제외하고는 동일한 코드 줄 이었습니다 slice
.
내가 관련된 노력 다른 솔루션 split
또는 RegExp
의 큰 성능 저하를 가져다가 2 개에 대해 하였다 크기 순서 느린. 물론 join
의 결과를 사용 split
하면 추가 성능 저하가 추가됩니다.
왜 느려요? 새로운 객체 또는 배열을 만들 때마다 JS는 OS에서 메모리 청크를 요청해야합니다. 이 과정은 매우 느립니다.
벤치 마크를 쫓는 경우를위한 일반적인 지침은 다음과 같습니다.
- 객체
{}
나 어레이에 대한 새로운 동적 메모리 할당 []
( split
생성 하는 것과 같은 )은 많은 비용이 들게됩니다.
RegExp
검색은 문자열 검색보다 복잡하고 느립니다.
- 이미 배열이있는 경우 배열을 파괴하는 것은 명시 적으로 색인을 생성하는 것만 큼 빠르며 멋지게 보입니다.
첫 번째 인스턴스를 넘어서 제거
다음은 n 번째 인스턴스까지 슬라이스하는 솔루션입니다. 빠르지는 않지만 OP의 질문에 따르면 gobble(element, '_', 1)
여전히 a RegExp
또는 split
솔루션 보다 2 배 이상 빠르며 더 많은 작업을 수행 할 수 있습니다.
/*
`gobble`, given a positive, non-zero `limit`, deletes
characters from the beginning of `haystack` until `needle` has
been encountered and deleted `limit` times or no more instances
of `needle` exist; then it returns what remains. If `limit` is
zero or negative, delete from the beginning only until `-(limit)`
occurrences or less of `needle` remain.
*/
function gobble(haystack, needle, limit = 0) {
let remain = limit;
if (limit <= 0) { // set remain to count of delim - num to leave
let i = 0;
while (i < haystack.length) {
const found = haystack.indexOf(needle, i);
if (found === -1) {
break;
}
remain++;
i = found + needle.length;
}
}
let i = 0;
while (remain > 0) {
const found = haystack.indexOf(needle, i);
if (found === -1) {
break;
}
remain--;
i = found + needle.length;
}
return haystack.slice(i);
}
위의 정의로 gobble('path/to/file.txt', '/')
파일 이름을 지정 gobble('prefix_category_item', '_', 1)
하고이 답변의 첫 번째 솔루션과 같은 접두사를 제거합니다.
- 테스트는 macOSX 10.14의 Chrome 70.0.3538.110에서 실행되었습니다.