2012-09-25 24 views
15
List data = [1, 2, 3]; 
data.forEach((value) { 
    if (value == 2) { 
    // how to stop? 
    } 
    print(value); 
}); 

Probé return false; que funciona en jQuery, pero no funciona en Dart. ¿Hay alguna manera de hacerlo?Cómo detener el .forEach de Dart()?

+0

¿Qué significa "does not work"? ¿Qué es lo que hace? –

+0

No hace nada. – Leksat

+0

Cuando dice que esto funciona en JavaScript, ¿quiere decir en una biblioteca como jQuery? Lo pregunto porque parece que el algoritmo que se describe aquí no infringe un valor de retorno falso: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach Considere la posibilidad de presentar un error si quieres esta característica. –

Respuesta

16

También puede utilizar una para/en, que utiliza implícitamente el iterador acertadamente demostrada en la otra respuesta:

List data = [1,2,3]; 

for(final i in data){ 
    print('$i'); 
    if (i == 2){ 
    break; 
    } 
} 
+0

la solución "takeWhile()" a continuación aprovecha los cambios más recientes en Dart y es probablemente una solución mejor, para la mayoría de los casos. –

8

La devolución de llamada de forEach toma devoluciones anuladas por lo que no hay ningún mecanismo para detener la iteración.

En este caso, usted debe utilizar iteradores:

void listIteration() { 
    List data = [1,2,3]; 

    Iterator i = data.iterator(); 

    while (i.hasNext()) { 
    var e = i.next(); 
    print('$e'); 
    if (e == 2) { 
     break; 
    } 
    } 
} 
2

dardo hace no admite devoluciones no locales, por lo que regresar de una devolución de llamada no romperá el ciclo. El motivo por el que funciona en jQuery es que cada uno() verifica el valor devuelto por la devolución de llamada. Dart forEach callback returns void.

http://docs.jquery.com/Core/each

7

Romper un List

List<int> example = [ 1, 2, 3 ]; 

for (int value in example) { 
    if (value == 2) { 
    break; 
    } 
} 

Romper un Map

Si usted está tratando con un Map no se puede simplemente obtener un iterador del mapa dado, pero se puede aún use un for aplicándolo a los valores o las teclas. Ya que a veces puede ser que necesite la combinación de ambas claves y valores, he aquí un ejemplo:

Map<String, int> example = { 'A': 1, 'B': 2, 'C': 3 }; 

for (String key in example.keys) { 
    if (example[key] == 2 && key == 'B') { 
    break; 
    } 
} 

Tenga en cuenta que un mapa no necesariamente tienen los claves como [ 'A', 'B', 'C' ] utilizar un LinkedHashMap si desea eso. Si solo quiere los valores, solo haga example.values en lugar de example.keys.

Alternativamente si sólo está en busca de un elemento, se puede simplificar todo lo posible para:

List<int> example = [ 1, 2, 3 ]; 
int matched = example.firstMatching((e) => e == 2, orElse:() => null); 
11

También es posible implementar el ejemplo usando foreach() y takeWhile().

var data = [1, 2, 3]; 
data.takeWhile((val) => val != 2).forEach(print); 
+0

.takeWhile() no estaba disponible cuando publiqué la respuesta original. Diría que ahora es un enfoque más apropiado y elegante para la mayoría de los casos. –