Проблема:
Ваша функция сравнивает каждый символ из ref
отдельно с символом data
во внутреннем l oop, помещая каждое совпадение символа внутри массива (proto
) и используя join
, чтобы преобразовать массив обратно в строку (proto2
), прежде чем сравнивать его с исходным ref
.
Это крайне неэффективно и может быть значительно упрощено, поэтому, несомненно, эта функция намного медленнее, чем String.prototype.indexOf () .
Решение:
Вместо этого у вас может быть один l oop, итерация через data
, и для каждой итерации извлекать срез из data
той же длины, что и ref
, прежде чем сравнивать это ломтик с ref
. Если оба значения совпадают, строка ref
была найдена в data
, и был возвращен соответствующий индекс:
function searchString(ref, data) {
for (let i = 0; i <= data.length - ref.length; i++) {
if (ref === data.slice(i, i + ref.length)) return i;
}
return -1;
}
При использовании этой функции я получаю такое же время выполнения, как и при indexOf
.
Ссылка: