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

我試過return false;它在jQuery中工作,但它不適用於Dart。 有沒有辦法做到這一點?如何停止Dart的.forEach()?

+0

「不起作用」是什麼意思?它實際上做了什麼? –

+0

它什麼也沒做。 – Leksat

+0

當你說這在JavaScript中有效時,你的意思是像jQuery這樣的庫嗎?我問,因爲它看起來像這裏概述的算法不會返回false值:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach 考慮提交一個錯誤,如果你想要這個功能。 –

回答

16

您也可以使用for /中,其中隱含使用在對方的回答恰如其分地證明迭代器:

List data = [1,2,3]; 

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

下面的「takeWhile()」解決方案利用了對Dart的更新更改,對於大多數情況來說,這可能是更好的解決方案。 –

8

forEach所需的回調函數將返回void,因此沒有機制來停止迭代。

在這種情況下,你應該使用迭代器:

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

飛鏢呢不支持非本地回報,所以從回調中返回不會破壞循環。 它在jQuery中工作的原因是each()檢查回調返回的值。 Dart forEach回調返回void。

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

7

打破一個List

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

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

打破一個Map

如果你和一個Map打交道,你不能簡單地從給定圖的迭代器,但你可以仍然使用for將其應用於值或鍵。既然你有時可能需要兩個鍵和值的組合,這裏有一個例子:

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

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

注意,一個地圖不一定他們鍵作爲[ 'A', 'B', 'C' ]使用LinkedHashMap中,如果你想要的。如果你只是想要的值,只是做example.values而不是example.keys

或者,如果你只是尋找一個元素,可以簡化一切:

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

也可以實施及如何使用foreach()和takeWhile()的例子。

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

.takeWhile()不在我發佈原始答案時。我想說現在對大多數情況來說,這是一種更合適和優雅的方法。 –