2011-11-22 7 views
49

qualcuno può dirmi perché il ciclo non si è interrotto dopo la voce 5?
http://jsbin.com/ucuqot/edit#previewJquery ciascuno - Arresta il ciclo e restituisce l'oggetto


$(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! 
    } 
    }); 
} 

Grazie in anticipo!

+0

sei sicuro che questo è vero se (someArray [i] == 'someArray') – zaoudis

+2

Penso che questa condizione (someArray [i] == 'someArray') dovrebbe essere (someArray [i] == word) – Irfan

+1

@ user970727 prendere in considerazione la mia risposta. sta usando la funzione integrata (i, n) in ogni comando –

risposta

109

Perché quando si utilizza un'istruzione return all'interno di un each ciclo, un valore "non-false" fungerà da continue, wheras false agirà come un break . È necessario restituire false dalla funzione each. Qualcosa di simile a questo:

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

Dal docs:

possiamo rompere il ciclo $ .each() in un particolare di iterazione, facendo la funzione di callback return false. Il ritorno non-falso è lo stesso di una dichiarazione continua in un ciclo for; salterà immediatamente alla successiva iterazione .

+1

perché non usi la funzione '(i, n)' integrata? –

+0

http://jsbin.com/ucuqot/4/edit#preview ... non si è fermato? – user970727

+0

Perché ho appena usato il codice l'OP inserito nella domanda e cambiato il 'ritorno'. –

1

qui:

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

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

Prova questo ...

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

modificato $.each funzione

$.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 ; 
} 

si romperà ciclo sul risultato non falsi/non vuoto e tornare indietro, così nel tuo caso sarebbe

return $.eachReturn(someArray, function(i){ 
    ...