Самое быстрое решение?
Я провел несколько тестов , и это решение выиграло: 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
s имели большой удар по производительности и были примерно на 2 порядка медленнее. Использование join
по итогам split
, конечно, добавляет дополнительную потерю производительности.
Почему они медленнее? Каждый раз, когда необходимо создать новый объект или массив, JS должен запросить кусок памяти у ОС. Этот процесс очень медленный.
Вот некоторые общие рекомендации, если вы гоняетесь за тестами:
- Новые динамические выделения памяти для объектов
{}
или массивов []
(например, для split
создаваемого) будут стоить очень дорого.
RegExp
поиск более сложен и поэтому медленнее, чем поиск строк.
- Если у вас уже есть массив, деструктурирование массивов происходит примерно так же быстро, как и их явная индексация, и выглядит потрясающе.
Удаление за пределы первой инстанции
Вот решение, которое будет нарезано вплоть до n-го экземпляра. Это не так быстро, но, по мнению ОП, gobble(element, '_', 1)
все еще> в 2 раза быстрее, чем решение RegExp
или, split
и может сделать больше:
/*
`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)
удалит префикс, как первое решение в этом ответе.
- Тесты проводились в Chrome 70.0.3538.110 на macOSX 10.14.