Giải pháp nhanh nhất?
Tôi đã chạy một số điểm chuẩn và giải pháp này đã thắng rất nhiều: 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);
};
So sánh hiệu suất với các giải pháp khác
Ứng cử viên gần gũi duy nhất là cùng một dòng mã, ngoại trừ sử dụng substr
thay vì slice
.
Các giải pháp khác mà tôi đã thử liên quan split
hoặc RegExp
đã đạt được hiệu suất lớn và chậm hơn khoảng 2 bậc . Tất nhiên, sử dụng join
kết quả của split
việc thêm hình phạt hiệu suất.
Tại sao họ chậm hơn? Bất cứ khi nào một đối tượng hoặc mảng mới phải được tạo, JS phải yêu cầu một đoạn bộ nhớ từ HĐH. Quá trình này rất chậm.
Dưới đây là một số hướng dẫn chung, trong trường hợp bạn đang theo đuổi điểm chuẩn:
- Phân bổ bộ nhớ động mới cho các đối tượng
{}
hoặc mảng []
(như cái được split
tạo) sẽ tốn rất nhiều hiệu năng.
RegExp
tìm kiếm phức tạp hơn và do đó chậm hơn tìm kiếm chuỗi.
- Nếu bạn đã có một mảng, việc phá hủy các mảng sẽ nhanh như việc lập chỉ mục chúng một cách rõ ràng và trông thật tuyệt vời.
Loại bỏ vượt quá phiên sơ thẩm
Đây là một giải pháp sẽ cắt ra và bao gồm cả thể hiện thứ n. Nó không hoàn toàn nhanh như vậy, nhưng theo câu hỏi của OP, gobble(element, '_', 1)
vẫn nhanh hơn> 2 lần so với một giải pháp RegExp
hoặc split
có thể làm được nhiều hơn:
/*
`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);
}
Với định nghĩa trên, gobble('path/to/file.txt', '/')
sẽ đưa ra tên của tệp và gobble('prefix_category_item', '_', 1)
sẽ loại bỏ tiền tố như giải pháp đầu tiên trong câu trả lời này.
- Các thử nghiệm đã được chạy trong Chrome 70.0.3538.110 trên macOSX 10.14.