2010-10-15 39 views
37

Tôi muốn sử dụng return false để ngắt một .each() nhưng cũng trả về một giá trị cùng một lúc. Tôi có thể làm cái này như thế nào?Cách thoát khỏi .each() và trả về một giá trị cho hàm

Vui lòng tham khảo một công việc xung quanh hoạt động để xem những gì tôi đang cố gắng để làm:

function HasStores(state) { 
    var statehasstores = false; 

    $(stores).each(function (index, store) { 
     if (state == store.state && store.category == "meyers") { 
      statehasstores = true; 
      return false; // break 
     } 
    }); 

    return statehasstores; 
} 

Id gì muốn làm trong mã giả là:

Function() { 
    for() { 
     if found { 
      return true; 
     } 
    } 
    return false; 
} 
+0

Nó đã làm điều đó! Hãy xem ví dụ của tôi http://jsfiddle.net/aXkcW/ – BrunoLM

+0

Đây là lần đầu tiên trong SO mà tôi tìm thấy câu trả lời tôi đang tìm kiếm bên trong câu hỏi OP hỏi lol – NecipAllef

Trả lời

37

Bạn đang làm đúng ...

Trích từ http://api.jquery.com/each/

"Chúng ta có thể ngăn chặn sự lặp từ bên trong hàm callback bằng cách trả lại false".

+5

Điều đó không trả lời câu hỏi. Anh ta cũng muốn trả về một giá trị sau khi trả về false, tức là phân biệt 'return false' khỏi việc kết thúc vòng lặp. – Ariel

+0

@Ariel Làm thế nào về https://jsbin.com/tonozu/edit?html,js,console? Giá trị trả về là 'true' nếu điều kiện được đáp ứng (giống như nhiệm vụ mã giả của OP), và nó thoát ra khỏi vòng lặp. –

+0

@ ŠimeVidas Điều đó (phương pháp JS, không phải JQ, 'some') hoàn toàn không liên quan. Tôi ngạc nhiên khi câu trả lời này có 36 (!) Upvotes và vẫn là câu trả lời được chấp nhận (vì OP có thể thay đổi điều đó). Xin vui lòng xem câu trả lời của tôi. –

2

gì bạn đang đề xuất là cách để làm điều đó. Tôi nghĩ về nó ít hơn như một cách giải quyết và nhiều hơn như là một thành ngữ.

4

Hoặc, bạn có thể sử dụng vòng lặp for thay vì each() và chỉ trả lại giá trị.

+0

Điều này cũng sẽ làm cho mã dễ đọc hơn một chút. – reformed

9

Sử dụng biến ngoài vòng lặp để nhận giá trị và sử dụng nó sau đó.

var value; 

$(stores).each(function (index, store) { 
    if(state == store.state && store.category == "meyers"){ 
     statehasstores = true; 
     value = store; // added line 
     return false; //break 
    } 
}); 

alert(value); 

Cách bạn đang làm là tốt. I've tested on jsFiddle, see an example here.

Nó không hoạt động cho bạn? Bạn có thể hiển thị thêm ngữ cảnh không?

11

Hãy sáng tạo:

try { 
    $(stores).each(function (index, store) { 
    if(state == store.state && store.category == "meyers"){ 
     throw store; 
    } 
    }); 
} 
catch(e) { 
    // you got e with the value 
} 

Không, tôi chỉ đùa thôi, không sử dụng :) này. Nó đến như một ý tưởng tôi thích chia sẻ.

+0

Tôi thích ý tưởng. : P – BrunoLM

+3

Tôi cảm thấy thực sự tồi tệ khi bỏ qua điều này ... nhưng tôi thực sự thích suy nghĩ sáng tạo ^^ – Levit

+0

Tôi không thể nhớ giao diện "chính thống" hiện đang ở trong JS liên quan đến việc sử dụng Ngoại lệ như các kỹ thuật mã thông thường. "Kinh nghiệm" của một số ngôn ngữ vào những thời điểm nhất định đã dabbled với ý tưởng này ... nhưng đối với tôi, là một simpleton, tôi có xu hướng suy nghĩ "Ngoại lệ cho các tình huống đặc biệt", hoặc "Khi mã ngoại lệ cho một cái gì đó, ném một ngoại lệ" . Một, um, ngoại lệ cho điều này có thể là khi lựa chọn thay thế quá phức tạp. Nhưng đó không phải là trường hợp ở đây. Một lý do thực tế để tránh loại sử dụng ngoại lệ này là bạn không biết các chi phí liên quan đến việc xử lý chúng. –

1

Được rồi tôi đoán có một nghi ngờ chút về thời điểm này có lẽ tôi đang làm cho nó rõ ràng hơn ở đây:

  • Khi jquery doc nói: "Chúng ta có thể ngăn chặn sự lặp từ bên trong hàm callback bằng cách trả lại sai . " và bạn làm:

    Chức năng() { cho() { nếu tìm thấy { trả về true; }
    } trả về false; }

Điều này không có nghĩa là chức năng của bạn sẽ trở lại đúng khi tìm phần tử được tìm kiếm. Thay vào đó, nó sẽ luôn trả về false.

Vì vậy, để làm cho công việc chức năng của bạn như bạn whish Tôi đề nghị làm như vậy:

Function() { 
    variable found = false; 
foreach() { 
    if found { 
     found = true; 
     return false; // This statement doesn't make your function return false but just cut the loop 
    } 
} 
return found; 

}

Tất nhiên có rất nhiều cách khác để thực hiện điều này, nhưng tôi nghĩ rằng đây là đơn giản nhất.

Coopa - Dễ dàng!

0

Như những người khác đã ghi nhận từ jQuery Each, trả về sai sẽ chỉ ngắt khỏi vòng lặp không trả về giá trị, trả về true tuy nhiên sẽ 'tiếp tục' và ngay lập tức bắt đầu lặp lại tiếp theo. Với kiến ​​thức đó, bạn phần nào có thể đơn giản hóa mã của bạn như thế này:

function HasStores(state) { 
    var statehasstores = false; 

    $(stores).each(function (index, store){ 

    // continue or break; 
    statehasstores = !(state == store.state && store.category == "meyers")) 
    return statehasstores; 
    }); 

    return !statehasstores; 
} 

Điều này tất nhiên là một chút ngớ ngẩn bằng cách sử dụng đôi tiêu cực, và có tác dụng phụ của việc tiết kiệm 'true' để statehasstores cho mỗi lần lặp sai và ngược ngược lại, tuy nhiên kết quả cuối cùng phải giống nhau và bạn không còn có câu lệnh if.

0

Làm thế nào về:

$.each(myObj, function(key, value){ 
    ... 
    if(sthg...){ 
    myObj.somethingWentHorriblyWrong = true; 
    return false; 
    } 
}); 

if(myObj.somethingWentHorriblyWrong){ 
    // ... do something, not forgetting to go: 
    delete myObj.somethingWentHorriblyWrong; 
} 

PS Tôi đã bước đầu quan tâm đến những gì $.each(... thực sự trả về. Như nó nói trên relevant JQ page, "Phương thức trả về đối số đầu tiên của nó, đối tượng đã được lặp lại", nhưng trên thực tế giải pháp thậm chí không yêu cầu bạn sử dụng thực tế đó ...

PPS Cần một hàm trả về một giá trị? Bọc trong một chức năng bên ngoài của khóa học.

Các vấn đề liên quan