JQuery: как использовать каждый запуск с индексом, отличным от 0

У меня есть набор элементов, которые я хочу использовать для каждого цикла, но я перебираю их внутри внешнего цикла. Когда я нахожу то, что хочу в каждом, я возвращаю ложь, чтобы вырваться. В следующий раз, когда выполняется внешний цикл, я хочу начать с каждого из элементов после того, как я вернулся. Пример общего кода:

var nextIndex = 0;

for (var j=1; j <= someCount; j++) {
    // do outside loop stuff

    $('#someElemID').find('.someClass').each(function(index) {
        if (/*this is right one*/) {
            // do something
            // next index should get passed to each function next loop... somehow?
            nextIndex = index + 1; 
            return false;
        }
    });
}

Я думал о переключении в цикл for, но потом я смутился о том, как получить доступ к возврату из .find('.someClass'). Может быть, это отдельный вопрос...

Является ли это очевидным?

Ответы

Ответ 1

Используйте slice() http://api.jquery.com/slice/

$('#someElemID').find('.someClass').slice(nextIndex).each( ...  

btw, если элементы статичны, рассмотрите кэширование:

var $elms = $('.someClass', '#someElemID'),
    nextIndex = 0;

for (var j = 1; j <= someCount; j++) {
    // do outside loop stuff

    $elms.slice(nextIndex).each(function(index) {
        if (/*this is right one*/) {
            nextIndex = index + 1; 
            return false;
        }
    });
}

Это должно значительно повысить производительность.

Ответ 2

Другая возможность - сохранить индекс unincremented, тогда вы можете использовать gt селектор, чтобы напрямую выбирать элементы, которые происходят после сохраненного индекса, например это:

$('#someElemID .someClass:gt(' + storedIndex + ')').each(function() {
    ...

Ответ 3

Я не знаю, как часто вы будете запускать это или сколько разных изменений вам нужно, но я не люблю оставлять nextValue плавающим в пространстве. Вы могли бы сделать что-то подобное, что даст вам возможность создавать несколько разных "очередей", если хотите. Похоже, вы только хотите найти этот элемент один раз, и как только вы это сделаете, вы никогда не захотите его снова искать. Это должно сделать именно это, и оно работает путем кеширования селектора. Если вы меняете DOM между вызовами, используйте один из других ответов.

nameThisFunction = function(s) {
    var self = this;
    this.selector = $(s);
    return function(searchFor) {
        self.selector.each(function(i) {
            if (/*Do your comparision to searchFor*/) {
                // Do what you want
                self.selector.splice(i, 1);
                return false;
            }
        });

    }
};

var thisQueue = new nameThisFunction('#someElemId .someClass');

thisQueue('Search for something here');

Вот пример скрипта: http://jsfiddle.net/robert/RCfeJ/