[5, 4, 4, 6].indexOfArray([4, 6]) // 2
['foo', 'bar', 'baz'].indexOfArray(['foo', 'baz']) // -1
Я придумал это:
Array.prototype.indexOfArray = function(array) {
var m = array.length;
var found;
var index;
var prevIndex = 0;
while ((index = this.indexOf(array[0], prevIndex)) != -1) {
found = true;
for (var i = 1; i < m; i++) {
if (this[index + i] != array[i]) {
found = false;
}
}
if (found) {
return index;
}
prevIndex = index + 1
}
return index;
};
Позже я обнаружил, что Википедия называет это Наивным поиском строк :
В обычном случае нам нужно только взглянуть на один или два символа для каждой неправильной позиции, чтобы увидеть, что это неправильная позиция, поэтому в среднем случае требуется O (n + m) шагов, где n длина стога сена, а m - длина иглы; но в худшем случае, для поиска строки типа «aaaab» в строке типа «aaaaaaaaab» требуется O (нм) шагов.
Может кто-нибудь написать более быстрый метод indexOfArray в JavaScript?