Я хотел написать функцию для поиска смежного субарама в заданном массиве из заданного начального индекса и вернуть индекс подмассива в массив, если он найдет, и -1, если он не найден. Это похоже на String.indexOf
, но для массивов и подмассивов вместо строк и подстрок.
Это мой рабочий код:
var find_csa = function (arr, subarr, from_index) {
if (typeof from_index === 'undefined') {
from_index = 0;
}
var i, found, j;
for (i = from_index; i < 1 + (arr.length - subarr.length); ++i) {
found = true;
for (j = 0; j < subarr.length; ++j) {
if (arr[i + j] !== subarr[j]) {
found = false;
break;
}
}
if (found) return i;
}
return -1;
};
И это мои тесты и их ожидаемые значения:
console.log(find_csa([1, 2, 3, 4, 5], [2, 3, 4]) === 1);
console.log(find_csa([1, 2, 3, 4, 5], [5]) === 4);
console.log(find_csa([1, 2, 3, 4, 5], [1, 3]) === -1);
console.log(find_csa([1, 2, 3, 4, 5], [42]) === -1);
console.log(find_csa([1, 2, 3, 4, 5], []) === 0);
console.log(find_csa([3, 4, 3, 4, 3, 4], [3, 4, 3], 1) === 2);
console.log(find_csa([6, 6, 6, 7], [6, 6, 7]) === 1);
console.log(find_csa([12, 9, 16, 42, 7, 866, 3], [16, 42, 7, 866]) === 2);
Мой код передает тесты, но, как вы можете видеть, он использует логическое значение found
во внутреннем цикле, который является всего лишь моим беспорядочным, ad-hoc способом продолжения внешнего цикла из вложенного цикла. есть ли более чистый способ его написания? Я просмотрел Array.prototype.findIndex
, но сейчас это экспериментальная технология, поэтому я не могу ее использовать. Мне нужен метод, который работает в большинстве браузеров. Я знаю, что есть фрагмент кода polyfill, написанный на странице Mozilla, но это даже больше, чем мой текущий код, и он будет медленнее из-за вызовов функций, поэтому я бы предпочел избежать этого.
Моя основная цель для этой функции - производительность (субмарины будут очень маленькими, поэтому я считаю, что используя строчный алгоритм поиска Boyer-Moore или try - это слишком много, но моя вторая цель - изящество моей реализации. Учитывая эти две цели, я хотел бы знать, есть ли лучший способ написания этого кода, или если есть какие-либо функции или функции JavaScript, которые мне не хватает, что могло бы помочь мне избежать found
boolean.
JSFiddle, если это кому-то помогает: http://jsfiddle.net/qc4zxq2p/