Bagaimana cara beralih ke iterasi berikutnya di jQuery.each () util?

434

Saya mencoba untuk beralih melalui berbagai elemen. Dokumentasi jQuery mengatakan:

dokumentasi jquery.Each ()

Mengembalikan non-salah adalah sama dengan pernyataan melanjutkan dalam loop untuk, itu akan langsung melompat ke iterasi berikutnya.

Saya sudah mencoba memanggil 'kembali tidak palsu;' dan 'tidak salah;' (sans return) tidak ada yang melompat ke iterasi berikutnya. Sebagai gantinya, mereka memutus loop. Apa yang saya lewatkan?

Josh
sumber
9
Dalam kebijaksanaan mereka yang tak terbatas, bods di jQuery sekarang telah menghapus catatan ini dari dokumentasi - atau setidaknya, itu tidak ada di halaman untuk masing-masing () . Jadi saya sangat senang melihat pertanyaan ini masih dapat ditemukan di sini di SO, dan dengan ekstensi di Google, karena ini adalah salah satu hal sederhana yang selalu saya lupakan :)
Doug McLean

Jawaban:

783

Yang mereka maksud dengan non-false adalah:

return true;

Jadi kode ini:

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>

akan log one, two, four, five.

Paolo Bergantino
sumber
16
Untuk keluar hanya iterasi saat ini, cukup dengan mengembalikan 'kembali'. Dan untuk keluar dari semua iterasi, kembalikan false.
Saulius
7
Nilainya mengatakan bahwa ini berfungsi karena Anda berada dalam suatu fungsi ketika kode ini dieksekusi.
Ukuser32
ketika saya kembali (arr [i] === 'three'); mengapa itu tidak berfungsi ??
ajayv
Bagi saya, non-false mean, Anda dapat mengembalikan apa pun kecuali return false;
Hoang Trung
61

Dengan 'return non-false', mereka bermaksud mengembalikan nilai apa pun yang tidak akan berhasil menjadi boolean false. Sehingga Anda bisa kembali true, 1, 'non-false', atau apapun yang Anda bisa memikirkan.

TJ L
sumber
20
mengapa tidak hanya demi alasan "kembali 'melanjutkan';"
Alexander Mills
bagaimana dengan melanjutkan ;? yang bekerja dalam variasi C tajam saya bekerja dengan jadi saya hanya menebak itu akan memiliki efek yang sama di JS
Brandito
@ Brando Ini tidak berjalan seperti loop normal - itu memanggil fungsi secara rekursif, jadi agar loop berlanjut, Anda harus mengakhiri pemrosesan di dalam fungsi.
TJ L
5

Jenis Javascript memiliki ide 'kebenaran' dan 'kepalsuan'. Jika suatu variabel memiliki nilai maka, umumnya 9 seperti yang Anda akan lihat) itu memiliki 'kebenaran' - nol, atau tidak ada nilai cenderung 'kepalsuan'. Cuplikan di bawah ini dapat membantu:

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

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

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

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

Semoga itu bisa membantu?

Juga, ada baiknya memeriksa video ini dari Douglas Crockford

pembaruan: terima kasih @cphpython karena telah menemukan tautan yang rusak - Saya telah memperbarui untuk menunjukkan versi yang berfungsi sekarang

Bahasa Javascript

Javascript - Bagian Yang Baik

mlennox
sumber
1
Tautan terputus ... Btw, 0juga merupakan nilai palsu dan negasinya benar (dan sebaliknya ke nomor lain, misalnya !-42 === false).
CPHPython
4

Jangan lupa bahwa Anda kadang-kadang bisa saja jatuh dari ujung blok untuk sampai ke iterasi berikutnya:

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

Daripada benar-benar kembali seperti ini:

$(".row").each( function() {
    if ( leaveTheLoop ) 
        return; //go to next iteration in .each()
    ... do stuff here ...
});
Lee Meador
sumber
3
Saya tidak bermaksud kasar tetapi ini adalah desain yang sangat mengerikan. Maksudku ... aku sudah melakukannya, di 2 tahun pertama kuliahku, ketika aku tidak tahu yang lebih baik (bahkan kemudian aku tidak menyukainya), tapi itu bukan sesuatu yang harus disarankan ...
xDaizu
@ DanielParejoMuñoz, saya mendengar Anda, tetapi kami tidak setuju. Pilihan untuk tidak memiliki pernyataan pengembalian mungkin bukan sesuatu yang Anda sukai. Tapi saya akan menyampaikan bahwa itu adalah hal suka / tidak suka daripada hal yang baik / buruk. Tidak ada yang memiliki keunggulan jelas secara objektif.
Lee Meador
4
ini memiliki kelemahan meningkatkan sarang
Dave Cousineau
3

Loop hanya terputus jika Anda kembali secara harfiah false. Ex:

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

Ini berarti Anda dapat mengembalikan apa pun, termasuk undefined, yang merupakan apa yang Anda kembalikan jika Anda tidak mengembalikan apa pun, sehingga Anda cukup menggunakan pernyataan pengembalian yang kosong:

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

   // otherwise do something
});

Mungkin ini dapat bervariasi menurut versi; ini berlaku untuk jquery 1.12.4. Tapi sungguh, ketika Anda keluar dari bagian bawah fungsi, Anda juga tidak mengembalikan apa-apa, dan itu sebabnya loop terus, jadi saya berharap bahwa tidak ada kemungkinan apa pun yang mengembalikan apa-apa tidak dapat melanjutkan loop. Kecuali mereka ingin memaksa semua orang untuk mulai kembali sesuatu untuk menjaga loop pergi, kembali tidak memiliki menjadi cara untuk menjaga itu terjadi.

Dave Cousineau
sumber
-3

jQuery.noop () dapat membantu

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});
melaxon
sumber
Tidak, fungsi noop () ini tidak membantu sama sekali. Ini hanya berfungsi karena blok "lain" tidak diaktifkan.
Rauni Lillemets