Реализация ключевых слов `continue;` в методе each (); `jQuery - PullRequest
3 голосов
/ 10 декабря 2011

Представьте, что я хочу перебрать список объектов jQuery, и для каждого из них выполнить несколько функций. Однако, если в каком-то месте критерий не выполняется, то я просто хочу continue; к другим объектам. Простой псевдокод может выглядеть примерно так:

$('#element').each(function(){
    // some code here
    if (!$(this).is('.included')) {
       continue; // This keyword of course, doesn't work here
    }
    // more code here, which won't get executed for some elements
});

Я хочу добиться того же эффекта, что и:

for (var i = 0; i < 10; i++) {
    if (i % 2 == 0 ) {
        continue;
    }
    console.log(i);
}

Я знаю, что могу return false; где-нибудь внутри each(); метода, чтобы полностью разорвать цикл. Но я не хочу прерывать петлю. Я только хочу пропустить некоторые элементы. Я также знаю, что могу использовать блоки if-else для пропуска элементов, но есть ли более удобный способ сделать это?

Ответы [ 4 ]

9 голосов
/ 10 декабря 2011

просто используйте return; вместо continue; (не return false;).

2 голосов
/ 10 декабря 2011

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

if ( callback.apply( object[ name ], args ) === false ) {
  break;
}

jQuery преднамеренно выходит из цикла, когда исполняемая функция возвращает false. Было бы здравым смыслом добавить это, верно? Поскольку он использует ===, вы можете вернуть все, что не равно false, включая undefined, null, 0, true или что угодно. Пока он не равен false, цикл будет продолжаться.

$.each([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], function(i) {
  if(i > 5) { return false; } // if(i > 5) { break;    }
  if(i < 2) { return null;  } // if(i < 2) { continue; }
   console.log(i);
});

Ваша консоль будет выглядеть так:

2
3
4
5

Обратите внимание, что он не регистрировал 0 и 1. i был меньше 2, поэтому он продолжил без регистрации. Обратите внимание, что он не регистрировал 6, 7, 8 и 9. Это потому, что когда i стало больше 5, он вернул false.

1 голос
/ 01 ноября 2013

jQuery.each docs говорит:

"Возвращение не ложно - то же самое, что и продолжить оператор в цикле for; он сразу перейдет к следующему итерация. «

Я обычно делаю return 'continue';, что является одновременно читабельным и более понятным, чем простое return;, return true; или return 1;

Я также столкнулся с return 'non-false';, что довольно забавно, просто отвратительно.

0 голосов
/ 10 декабря 2011

На самом деле я не вижу необходимости в выражении continue:

$('#element').each(function(){
    // some code here
    if( $(this).is('.included') ) {
        // more code here, which won't get executed for some elements
    }
});

Это должно происходить точно так же, если я что-то упустил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...