Làm thế nào để bỏ qua lần lặp tiếp theo trong jQuery.each () produc?


434

Tôi đang cố gắng lặp lại thông qua một loạt các yếu tố. Tài liệu của jQuery nói:

tài liệu jquery.Each ()

Trả về không sai cũng giống như một câu lệnh continue trong một vòng lặp for, nó sẽ bỏ qua ngay lập tức cho lần lặp tiếp theo.

Tôi đã thử gọi 'trả lại không sai;' và 'không sai;' (sans return) không ai trong số đó bỏ qua lần lặp tiếp theo. Thay vào đó, họ phá vỡ vòng lặp. Tôi đang thiếu gì


9
Theo trí tuệ vô hạn của họ, các bộ phận tại jQuery hiện đã xóa ghi chú này khỏi tài liệu - hoặc ít nhất, nó không có trong trang cho mỗi () . Vì vậy, tôi rất vui khi thấy câu hỏi này vẫn có thể được tìm thấy ở đây trên SO và bằng cách mở rộng trên Google, vì đây là một trong những điều đơn giản mà tôi luôn quên :)
Doug McLean

Câu trả lời:


783

Những gì họ có nghĩa là không sai là:

return true;

Mã này:

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>

sẽ đăng nhập one, two, four, five.


16
Để chỉ thoát khỏi lần lặp hiện tại, chỉ cần trả về 'return' là đủ. Và để thoát tất cả các lần lặp về phía trước trả về false.
Saulius

7
Cần phải nói rằng điều này hoạt động vì bạn đang ở trong một hàm khi mã này được thực thi.
Ukuser32

khi tôi quay trở lại (mảng [i] === 'ba'); tại sao nó không hoạt động ??
ajayv

Đối với tôi, ý nghĩa không sai, bạn có thể trả lại bất cứ điều gì ngoại trừ trả về false;
Hoàng Trung

61

Bằng cách 'trả về không sai', họ có nghĩa là trả về bất kỳ giá trị nào không phù hợp với boolean false. Vì vậy, bạn có thể trở lại true, 1, 'non-false', hoặc bất cứ điều gì khác mà bạn có thể nghĩ ra.


20
tại sao không chỉ vì mục đích khám phá vì "trở lại" tiếp tục ";"
Alexander Mills

những gì về tiếp tục ;? đã hoạt động trong một biến thể của C sharp tôi đã làm việc với vì vậy tôi chỉ đoán nó sẽ có hiệu ứng tương tự trong JS
Brandito

@Brandito Nó không chạy như một vòng lặp thông thường - nó đang gọi một hàm theo cách đệ quy, vì vậy để vòng lặp tiếp tục, bạn cần kết thúc quá trình xử lý bên trong hàm.
TJ L

5

Javascript loại có ý tưởng về 'tính trung thực' và 'giả dối'. Nếu một biến có giá trị thì thông thường 9as bạn sẽ thấy) nó có 'tính trung thực' - null hoặc không có giá trị nào có xu hướng 'giả dối'. Các đoạn dưới đây có thể giúp:

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

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

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

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

Hy vọng rằng sẽ giúp?

Ngoài ra, giá trị của nó kiểm tra các video từ Douglas Crockford

cập nhật: cảm ơn @cphpython vì đã phát hiện ra các liên kết bị hỏng - Tôi đã cập nhật để trỏ đến các phiên bản làm việc ngay bây giờ

Ngôn ngữ Javascript

Javascript - Phần tốt


1
Liên kết bị hỏng ... Btw, 0cũng là một giá trị giả và sự phủ định của nó là trung thực (và ngược lại với bất kỳ số nào khác, ví dụ !-42 === false).
CPHPython

4

Đừng quên rằng đôi khi bạn có thể rơi ra khỏi cuối khối để đến lần lặp tiếp theo:

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

Thay vì thực sự trở lại như thế này:

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

3
Tôi không có ý thô lỗ nhưng đây là thiết kế khủng khiếp. Ý tôi là ... tôi đã làm nó, trong 2 năm đầu đại học, khi tôi không biết rõ hơn (thậm chí sau đó tôi không thích nó), nhưng đó không phải là điều nên được
khuyến khích

@ DanielParejoMuñoz, tôi nghe thấy bạn, nhưng chúng tôi không đồng ý. Lựa chọn không có tuyên bố trả lại có thể không phải là điều bạn thích. Nhưng tôi sẽ trình bày rằng đó là một điều thích / không thích chứ không phải là điều tốt / xấu. Không có lợi thế rõ ràng khách quan.
Lee Meador

4
điều này có nhược điểm là làm tổ ngày càng tăng
Dave Cousineau

3

Vòng lặp chỉ phá vỡ nếu bạn trở lại theo nghĩa đen false. Ví dụ:

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

Điều này có nghĩa là bạn có thể trả lại bất cứ thứ gì khác, bao gồm undefined, đó là những gì bạn trả lại nếu bạn không trả lại gì, vì vậy bạn chỉ cần sử dụng câu lệnh hoàn trả trống:

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

   // otherwise do something
});

Có thể điều này có thể thay đổi theo phiên bản; điều này được áp dụng cho jquery 1.12.4. Nhưng thực sự, khi bạn thoát ra khỏi đáy của hàm, bạn cũng trở về không có gì, và đó là lý do vòng lặp tiếp tục, vì vậy tôi hy vọng rằng không có khả năng nào mà trở về không có gì có thể không tiếp tục vòng lặp. Trừ khi họ muốn để buộc tất cả mọi người bắt đầu trở về một cái gì đó để giữ cho vòng lặp đi, trở về không có gì phải là một cách để giữ cho nó đi.


-3

jQuery.noop () có thể giúp

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});

Không, hàm noop () này không giúp được gì. Nó chỉ hoạt động vì khối "khác" không được kích hoạt.
Rauni Lillemets
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.