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

Tôi đã thử return false; hoạt động trong jQuery nhưng không hoạt động trong Dart. Có cách nào để làm điều đó không?Làm cách nào để dừng Dart .forEach()?

+0

"Không hoạt động" nghĩa là gì? Nó thực sự làm gì? –

+0

Nó không làm gì cả. – Leksat

+0

Khi bạn nói điều này làm việc trong JavaScript, bạn có nghĩa là trong một thư viện như jQuery? Tôi hỏi vì có vẻ như thuật toán được nêu ở đây không phá vỡ giá trị trả về của false: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach Cân nhắc gửi một nếu bạn muốn tính năng này. –

Trả lời

16

Bạn cũng có thể sử dụng một cho/trong, mà mặc nhiên sử dụng iterator aptly chứng minh trong câu trả lời khác:

List data = [1,2,3]; 

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

giải pháp "takeWhile()" bên dưới tận dụng các thay đổi gần đây hơn đối với Dart và có lẽ là giải pháp tốt hơn, đối với hầu hết các trường hợp. –

8

Gọi lại mà forEach sẽ trả về void vì vậy không có cơ chế để dừng lặp lại.

Trong trường hợp này bạn nên sử dụng vòng lặp:

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

Dart làm không hỗ trợ trả về không phải cục bộ, do đó, quay trở lại từ một cuộc gọi lại sẽ không phá vỡ vòng lặp. Lý do nó hoạt động trong jQuery là mỗi() kiểm tra giá trị được trả về bởi hàm gọi lại. Dart forEach trả về gọi lại void.

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

7

Breaking một List

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

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

Breaking một Map

Nếu bạn đang làm việc với một Map bạn có thể không chỉ đơn giản nhận được một iterator từ bản đồ nhất định, nhưng bạn có thể vẫn sử dụng một for bằng cách áp dụng nó cho các giá trị hoặc các phím. Vì bạn đôi khi có thể cần sự kết hợp của cả khóa và giá trị, đây là một ví dụ:

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

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

Lưu ý rằng một bản đồ không nhất thiết phải phím họ như [ 'A', 'B', 'C' ] sử dụng một LinkedHashMap nếu bạn muốn điều đó. Nếu bạn chỉ muốn các giá trị, chỉ cần thực hiện example.values thay vì example.keys.

Ngoài ra nếu bạn chỉ tìm kiếm một phần tử, bạn có thể đơn giản hóa mọi thứ để:

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

Nó cũng có thể thực hiện ví dụ của bạn sử dụng foreach() và takeWhile().

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

.takeWhile() không xung quanh khi tôi đăng câu trả lời gốc. Tôi muốn nói nó bây giờ là một cách tiếp cận phù hợp và thanh lịch hơn cho hầu hết các trường hợp. –