2011-11-22 8 views
49

¿Alguien puede decirme por qué el loop no se detuvo después de la 5 entrada?
http://jsbin.com/ucuqot/edit#previewJquery each - Stop loop y return object


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

Gracias de antemano!

+0

estás seguro de que esto es cierto si (someArray [i] == 'someArray') – zaoudis

+2

Creo que esta condición (someArray [i] == 'someArray') debería ser (someArray [i] == word) – Irfan

+1

@ user970727 tomar alook en mi respuesta. está utilizando la función integrada (i, n) en cada comando –

Respuesta

109

Porque cuando se utiliza una instrucción return dentro de un bucle each, un valor "no falsa" actuará como un continue, wheras false actuará como break . Tendrá que devolver false desde la función each. Algo como esto:

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

Desde el docs:

podemos romper el bucle $ each() a una iteración particular haciendo que la función de devolución de llamada return false. La devolución de no falso es la misma que la instrucción de continuar en un ciclo for; saltará de inmediato a la siguiente iteración .

+1

¿por qué no utiliza la función 'integrada (i, n)'? –

+0

http://jsbin.com/ucuqot/4/edit#preview ... ¿no se detuvo? – user970727

+0

Porque acabo de usar el código que OP publicó en la pregunta y cambié el 'return'. –

1

aquí:

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

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

Prueba esto ...

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

modificada $.each función

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

se romperá bucle en consecuencia no falso/no vacío y volver de nuevo, por lo que en su caso sería

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