En hızlı çözüm?
Ben bazı kriterler koştu ve bu çözüm çok kazandı: 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);
};
Diğer çözümlerle performans karşılaştırması
Tek yakın yarışmacı kullanmak substr
yerine aynı kod satırıydı slice
.
Dahil etmeye çalıştığım diğer çözümler split
veya RegExp
performans büyük bir hit aldı ve yaklaşık 2 derece daha yavaştı. Elbette join
sonuçlarını kullanmak , split
ek bir performans cezası ekler.
Neden daha yavaşlar? Yeni bir nesne veya dizi oluşturulması gerektiğinde, JS'nin işletim sisteminden bir yığın bellek istemesi gerekir. Bu süreç çok yavaş.
Kıyaslamaları takip etmeniz durumunda bazı genel yönergeler aşağıda verilmiştir:
- Nesneler
{}
veya diziler için []
(oluşturanlar gibi) yeni dinamik bellek ayırma işlemlerinin split
performansı çok maliyetli olacaktır.
RegExp
aramalar dize aramalarından daha karmaşık ve dolayısıyla daha yavaştır.
- Zaten bir diziniz varsa, dizileri yok etmek onları açıkça dizine eklemek kadar hızlıdır ve harika görünür.
İlk örneğin ötesinde kaldırma
İşte n'inci örneğe kadar dilimleyecek bir çözüm. Oldukça hızlı değil, ancak OP'nin sorusuna göre, gobble(element, '_', 1)
bir RegExp
veya split
çözümden > 2 kat daha hızlı ve daha fazlasını yapabilir:
/*
`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);
}
Yukarıdaki tanımla, gobble('path/to/file.txt', '/')
dosyanın adını verir ve gobble('prefix_category_item', '_', 1)
bu yanıttaki ilk çözüm gibi öneki kaldırır.
- Testler macOSX 10.14'te Chrome 70.0.3538.110'da yapıldı.