Как получить позицию второго вхождения?

Скажем, у меня есть этот массив:

var a = [1,2,99,3,4,99,5];

Я хотел бы получить позицию второго 99, что-то вроде:

a.indexOf(99, 2) // --> 5

Однако второй аргумент в indexOf просто указывает, с чего начать поиск. Есть ли встроенные функции для этого? Если нет, как бы вы это сделали?

Спасибо!


person Adam Halasz    schedule 23.01.2013    source источник


Ответы (2)


Есть только indexOf и lastIndexOf. Вы можете перебрать его:

var a = [1,2,99,3,4,99,5];
var matches = []
for (var i=0; i<a.length; i++){
    if (a[i] == 99) {
        matches.push(i)
    }
}
console.log(matches); // [2, 5]

Если вам всегда нужно второе вхождение, метод Яна также хорош:

a.indexOf(99, a.indexOf(99) + 1)

Вызов indexOf справа находит первое вхождение, +1 затем ограничивает поиск элементами, которые следуют за ним.

person Matt Zeunert    schedule 23.01.2013
comment
на самом деле ваш ответ правильный, однако я только что понял, что ищу что-то еще stackoverflow.com/questions/14480345/ - person Adam Halasz; 23.01.2013
comment
@Adam: Вы можете использовать мой ответ вместе с strpos вместо indexOf: php.net/manual /en/function.strpos.php - person Felix Kling; 23.01.2013
comment
@Adam: Упс... тогда просто продолжай использовать indexOf ;) Извини, на секунду запутался. Мое решение работает и для строк (если вы не хотите учитывать границы слов). Просто говорю' :) - person Felix Kling; 23.01.2013

Встроенной функции нет, но вы можете легко создать свою собственную, многократно применяя indexOf:

function indexOfOccurrence(haystack, needle, occurrence) {
    var counter = 0;
    var index = -1;
    do {
        index = haystack.indexOf(needle, index + 1);
    }
    while (index !== -1 && (++counter < occurrence));
    return index;
}

// Usage
var index = indexOfOccurrence(a, 99, 2);

Но решение Мэтта может оказаться более полезным.

person Felix Kling    schedule 23.01.2013