List data = [1, 2, 3];
data.forEach((value) {
if (value == 2) {
// how to stop?
}
print(value);
});
我尝试return false;
了哪个在 jQuery 中有效,但在 Dart 中无效。有没有办法做到这一点?
List data = [1, 2, 3];
data.forEach((value) {
if (value == 2) {
// how to stop?
}
print(value);
});
我尝试return false;
了哪个在 jQuery 中有效,但在 Dart 中无效。有没有办法做到这一点?
您还可以使用 for/in,它隐式地使用在另一个答案中恰当演示的迭代器:
List data = [1,2,3];
for(final i in data){
print('$i');
if (i == 2){
break;
}
}
也可以使用 forEach() 和 takeWhile() 来实现您的示例。
var data = [1, 2, 3];
data.takeWhile((val) => val != 2).forEach(print);
打破一个List
List<int> example = [ 1, 2, 3 ];
for (int value in example) {
if (value == 2) {
break;
}
}
打破一个Map
如果您正在处理 a Map
,您不能简单地从给定的映射中获取迭代器,但您仍然可以for
通过将 a 应用于值或键来使用它。由于您有时可能需要键和值的组合,因此这里有一个示例:
Map<String, int> example = { 'A': 1, 'B': 2, 'C': 3 };
for (String key in example.keys) {
if (example[key] == 2 && key == 'B') {
break;
}
}
请注意,如果您需要, Map 不一定具有[ 'A', 'B', 'C' ]
使用 LinkedHashMap 的键。如果您只想要这些值,只需执行example.values
而不是example.keys
.
或者,如果您只搜索一个元素,您可以将所有内容简化为:
List<int> example = [ 1, 2, 3 ];
int matched = example.firstMatching((e) => e == 2, orElse: () => null);
forEach 接受的回调返回 void,因此没有停止迭代的机制。
在这种情况下,您应该使用迭代器:
void listIteration() {
List data = [1,2,3];
Iterator i = data.iterator;
while (i.moveNext()) {
var e = i.current;
print('$e');
if (e == 2) {
break;
}
}
}
Dart 不支持非本地返回,因此从回调返回不会破坏循环。它在 jQuery 中工作的原因是 each() 检查回调返回的值。Dart forEach 回调返回 void。
根据 Greg Lowe 的帖子,我在项目中使用了 where 并且它也有效。
var data = [1, 2, 3];
data.where((val) => val != 2).forEach(print);
使用多循环
打破外循环
OUTER: for (var i = 0; i < m.length; i++) {
for (var j = 0; j < m[i].length; j++) {
if (m[i][j] < 0) {
print("Negative value found at $i,$j: ${m[i][j]}");
break OUTER;
}
}
}
继续外循环
outer: for (var v in a) {
for (var w in b) {
if (w == v) continue outer;
}
print(v);
}
这是for-in循环的完整示例,接近forEach样式。
void main(){
var myList = [12, 18, 24, 63, 84,99];
myList.forEach((element) {
print(element);
if (element ==24); //break; // does not work
});
for(var element in myList) {
print(element);
if (element==24) break;
}
}
您可以使用for
和indexOf
for (var number in id) {
var index = id.indexOf(number);
print('Origin forEach loop');
for (int i = 0; i < 1; i++) {
print("for loop");
}
break;
}
有人建议where()
,但它不是forEach()
具有中断能力的一般替代品
(where
然而,这是问题示例中显示的用例的正确替代品。另一方面,我专注于标题中的问题)
的功能,foreach()
但与 , 的等价物由以下break
给出any()
:继续循环返回 false,停止返回 true;any() 的结果可以忽略。我认为它更类似于each()
在 jquery 中(但在 dart 中阻止你返回 true)。
为了有一个带索引的循环,但也有可能打破循环,我使用以下扩展:
extension IterableUtils<E> on Iterable<E> {
/**
Similar to Iterable.forEach() but:
- with an index argument
- with the optional capacity to break the loop, returning false
Note: as for the return clause, you can omit it, as with forEach()
*/
void forEachIndexed(Function(E element, int index) f) {
int index = 0;
for (E element in this) {
if (f(element, index) == false) break;
index++;
}
}
}
void main() {
List list = ["a", "b", "c"];
list.forEachIndexed((element, index) {
print("$index: $element");
//Optional:
if (element == "b") return false; //break
});
}
您可以从 forEach 清空返回以打破循环;
List<int> data = [1, 2, 3];
int _valueToBePrinted;
data.forEach((value) {
if (value == 2) {
_valueToBePrinted = value;
return;
}
});
// you can return something here to
// return _valueToBePrinted;
print(value);
反正你不应该...
问题是,你不能在整个 forEach 循环中返回任何东西
//This don't work
data.forEach((value) {
if (value == 2) {
_valueToBePrinted = value;
return;
}
if (value == 1) {
return value;
}
});