Як перейти до наступної ітерації в утиліті jQuery.each ()?


434

Я намагаюся перебрати через масив елементів. Документація jQuery говорить:

jquery.Each () документація

Повернення non-false - це те саме, що оператор «продовження» у циклі for for, він негайно перейде до наступної ітерації.

Я намагався зателефонувати "повернути неправдиво;" і "неправдиво;" (sans return), жоден з яких не переходить до наступної ітерації. Натомість вони розривають петлю. Що я пропускаю?


9
За своєю безмежною мудрістю, bods в jQuery тепер вилучили цю документацію з документації - або, принаймні, її немає на сторінці для кожного () . Тож я дуже радий, що це питання все ще можна знайти тут, так і в розширенні Google, оскільки це одна з тих простих речей, про які я завжди забуваю :)
Doug McLean,

Відповіді:


783

Що вони означають під неправдивим, це:

return true;

Отже цей код:

var arr = ["one", "two", "three", "four", "five"];
$.each(arr, function(i) {
  if (arr[i] == 'three') {
    return true;
  }
  console.log(arr[i]);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

зареєструє one, two, four, five.


16
Для виходу з поточної ітерації досить просто повернути «return». І для виходу з усіх ітерацій вперед повертайте помилково.
Саулій

7
Варто сказати, що це працює, тому що ви знаходитесь в функції, коли цей код виконується.
Ukuser32

коли я повернусь (arr [i] === 'три'); чому це не працює ??
Аджай

Для мене, неправдиве значення, ви можете повернути все, крім повернення помилкового;
Хоанг Трунг

61

Під „поверненням неправдивим” вони означають повернути будь-яке значення, яке не вийшло би булевим помилковим. Таким чином , ви могли б повернутися true, 1, 'non-false', або те , що ви можете придумати.


20
чому б не просто заради пояснень "повернути" продовжити ";"
Олександр Міллс

як щодо продовження ;? що працювало в
різній мові

@Brandito Він не працює як звичайний цикл - він викликає функцію рекурсивно, тому для продовження циклу потрібно закінчити обробку всередині функції.
TJ L

5

Сорт Javascript має уявлення про «правдивість» та «хибність». Якщо змінна має значення, то, як правило, ви бачите 9), вона має "правдивість" - нуль, або жодне значення не має значення "хибність". Нижче наведені фрагменти можуть допомогти:

var temp1; 
if ( temp1 )...  // false

var temp2 = true;
if ( temp2 )...  // true

var temp3 = "";
if ( temp3 ).... // false

var temp4 = "hello world";
if ( temp4 )...  // true

Сподіваємось, це допомагає?

Також варто переглянути ці відео з Дугласа Крокфорда

оновлення: дякую @cphpython за те, що помітили пошкоджені посилання - я оновив, щоб зараз вказати на робочі версії

Мова Javascript

Javascript - хороші частини


1
Посилання порушені ... Btw, 0також є хибною цінністю, а заперечення цього є правдою (і навпаки, будь-яким іншим числом, наприклад !-42 === false).
CPHPython

4

Не забувайте, що іноді ви можете просто відвалитися від кінця блоку, щоб перейти до наступної ітерації:

$(".row").each( function() {
    if ( ! leaveTheLoop ) {
        ... do stuff here ...
    }
});

Замість того, щоб насправді повертатися так:

$(".row").each( function() {
    if ( leaveTheLoop ) 
        return; //go to next iteration in .each()
    ... do stuff here ...
});

3
Я не хочу бути грубим, але це болісно жахливий дизайн. Я маю на увазі ... Я це зробив, на своїх двох перших курсах коледжу, коли я не знав кращого (навіть тоді мені це не сподобалось), але це не те, що слід
порадити

@ DanielParejoMuñoz, я чую вас, але ми не згодні. Вибір не мати заяви про повернення може бути не тим, що вам подобається. Але я б зазначив, що це подоба / неприязнь, а не гарна / погана річ. Жодних чітких переваг об'єктивно немає.
Лі Меадор

4
це має недолік збільшення гніздування
Дейв Кузен

3

Цикл розривається лише якщо ви повернетесь буквально false. Наприклад:

// this is how jquery calls your function
// notice hard comparison (===) against false
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
   break;
}

Це означає, що ви можете повернути що-небудь інше, в тому числі undefined, і це те, що ви повернете, якщо нічого не повернете, тож ви можете просто використовувати порожній виписку:

$.each(collection, function (index, item) {
   if (!someTestCondition)
      return; // go to next iteration

   // otherwise do something
});

Можливо, це може залежати від версії; це стосується jquery 1.12.4. Але на самому справі, коли ви виходите з нижньої частини цієї функції, ви також повернення нічого, і тому цикл триває, так що я б очікувати , що немає ніякої можливості взагалі що ні повертаючи нічого може НЕ продовжити цикл. Якщо вони не хочуть змусити всіх почати щось повертати, щоб продовжувати цикл, повернення нічого не повинно бути способом продовжувати це.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.