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

मैंने return false; की कोशिश की जो jQuery में काम करता है, लेकिन यह डार्ट में काम नहीं करता है। क्या ऐसा करने का कोई तरीका है?डार्ट्स को कैसे रोकें .forEach()?

+0

"काम नहीं करता" का क्या अर्थ है? वास्तव में यह क्या करता है? –

+0

यह कुछ भी नहीं करता है। – Leksat

+0

जब आप कहते हैं कि यह जावास्क्रिप्ट में काम करता है, तो क्या आपका मतलब jQuery जैसी लाइब्रेरी में है? मैं पूछता हूं क्योंकि ऐसा लगता है कि यहां उल्लिखित एल्गोरिदम झूठ के वापसी मूल्य पर नहीं टूटता है: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach फाइलिंग पर विचार करें अगर आप इस सुविधा को चाहते हैं तो बग। –

उत्तर

16

तुम भी उपयोग कर सकते हैं एक के लिए/में है, जो परोक्ष इटरेटर जिसे उपयुक्त अन्य जवाब में प्रदर्शन का उपयोग करता है:

List data = [1,2,3]; 

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

"टेकवॉल्ड()" समाधान नीचे डार्ट में हालिया परिवर्तनों का लाभ उठाता है और ज्यादातर मामलों के लिए शायद एक बेहतर समाधान है। –

8

कॉलबैक कि प्रत्येक के लिए रिटर्न शून्य हो जाता है इसलिए पुनरावृत्ति रोकने के लिए कोई तंत्र नहीं है।

इस मामले में आप iterators का उपयोग करना चाहिए:

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 में यह कारण है कि प्रत्येक() कॉलबैक द्वारा लौटाए गए मान की जांच करता है। प्रत्येक कॉलबैक के लिए डार्ट शून्य शून्य देता है।

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.keys के बजाय example.values करें।

वैकल्पिक रूप से अगर आप केवल एक तत्व की खोज कर रहे हैं, तो आप सब कुछ सरल बना सकते हैं करने के लिए:

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() जब मैं मूल उत्तर पोस्ट करता था तब आसपास नहीं था। मैं कहूंगा कि यह ज्यादातर मामलों के लिए अब एक और अधिक उपयुक्त और सुरुचिपूर्ण दृष्टिकोण है। –

संबंधित मुद्दे