2011-11-22 74 views
49

ai có thể cho tôi biết lý do tại sao vòng lặp không dừng sau mục 5?
http://jsbin.com/ucuqot/edit#previewJquery mỗi - Dừng vòng lặp và đối tượng trả về


$(document).ready(function() 
{ 
    someArray = new Array(); 
    someArray[0] = 't5'; 
    someArray[1] = 'z12'; 
    someArray[2] = 'b88'; 
    someArray[3] = 's55'; 
    someArray[4] = 'e51'; 
    someArray[5] = 'o322'; 
    someArray[6] = 'i22'; 
    someArray[7] = 'k954'; 

    var test = findXX('o322'); 

}); 

function findXX(word) 
{ 
    $.each(someArray, function(i) 
    { 
    $('body').append('-> '+i+'<br />'); 
    if(someArray[i] == 'someArray') 
    { 
     return someArray[i]; //<--- did not stop the loop! 
    } 
    }); 
} 

Cảm ơn trước!

+0

bạn có chắc điều này là đúng nếu (someArray [i] == 'someArray') – zaoudis

+2

Tôi nghĩ rằng điều kiện này (someArray [i] == 'someArray') nên được (someArray [i] == từ) – Irfan

+1

@ user970727 lấy alook tại câu trả lời của tôi. nó đang sử dụng hàm tích hợp (i, n) trong mỗi lệnh –

Trả lời

109

Bởi vì khi bạn sử dụng một tuyên bố return bên trong một each vòng lặp, một giá trị "không sai" sẽ đóng vai trò như một continue, wheras false sẽ hoạt động như một break . Bạn cần trả lại false từ chức năng each. Một cái gì đó như thế này:

function findXX(word) { 
    var toReturn; 
    $.each(someArray, function(i) { 
     $('body').append('-> '+i+'<br />'); 
     if(someArray[i] == word) { 
      toReturn = someArray[i]; 
      return false; 
     } 
    }); 
    return toReturn; 
} 

Từ docs:

Chúng ta có thể phá vỡ $ .each() vòng lặp tại một sự lặp lại đặc biệt bằng cách làm cho chức năng gọi lại trả về false. Trả về không sai cũng giống như một tuyên bố tiếp tục trong vòng lặp for; nó sẽ bỏ qua ngay lập tức để lặp lại tiếp theo.

+1

tại sao bạn không sử dụng hàm 'tích hợp '(i, n)'? –

+0

http://jsbin.com/ucuqot/4/edit#preview ... không dừng lại? – user970727

+0

Bởi vì tôi chỉ sử dụng mã OP được đăng trong câu hỏi và thay đổi 'return'. –

1

đây:

http://jsbin.com/ucuqot/3/edit

function findXX(word) 
{ 
    $.each(someArray, function(i,n) 
    { 
    $('body').append('-> '+i+'<br />'); 
    if(n == word) 
    { 
     return false; 
    } 
    }); 
} 
0

Hãy thử này ...

someArray = new Array(); 
    someArray[0] = 't5'; 
    someArray[1] = 'z12'; 
    someArray[2] = 'b88'; 
    someArray[3] = 's55'; 
    someArray[4] = 'e51'; 
    someArray[5] = 'o322'; 
    someArray[6] = 'i22'; 
    someArray[7] = 'k954'; 

    var test = findXX('o322'); 
    console.log(test); 



function findXX(word) 
{ 
    for(var i in someArray){ 


    if(someArray[i] == word) 
    { 
     return someArray[i]; //<--- stop the loop! 
    } 
    } 
} 
1

sửa đổi $.each chức năng

$.fn.eachReturn = function(arr, callback) { 
    var result = null; 
    $.each(arr, function(index, value){ 
     var test = callback(index, value); 
     if (test) { 
      result = test; 
      return false; 
     } 
    }); 
    return result ; 
} 

nó sẽ phá vỡ vòng lặp trên kết quả không sai/không có sản phẩm nào và trở lại, vì vậy trong trường hợp của bạn nó sẽ là

return $.eachReturn(someArray, function(i){ 
    ... 
Các vấn đề liên quan