如何打破jQuery的each循环?

845

如何跳出jQuery的 each 循环?

我已经尝试了:

 return false;

在循环中但这并没有起作用。有什么想法吗?


更新于2020年9月5日

我把return false;放错了位置。当我将其放在循环内部时,一切都正常工作了。


16
为了后人:为什么提问者说返回 false 没有起作用?几乎每个回答都建议这样做。想知道可能是因为那只会终止 each 循环。相比之下,在 for 循环内部使用 return 语句将退出循环和调用函数。要从 each 循环获得这样激进的行为,您需要在 each 循环内部使用具有闭包范围的标志,然后在其外部响应该标志。 - Bob Stein
12
@BobStein-VisiBone,有人删除了我的原始评论。我把return false放错地方了。当我修正后,一切都正常了。 - Luke101
1
不确定为什么“update”说return false$().each不兼容 - 因为它是可以的。 - But those new buttons though..
3
@Luke101,你应该更新问题,让人清楚什么没有起作用。当你的问题说接受的答案不起作用时,这个问答就没有意义。 - xr280xr
1
@daprezjer,您希望如何修改问题?我会进行编辑,但不确定什么是合适的。 - Luke101
显示剩余2条评论
7个回答

1498
为了中断一个 $.each$(selector).each 循环,你需要在循环回调函数中返回 false。如果返回 true,它将跳过当前迭代,相当于普通循环中的 continue
$.each(array, function(key, value) { 
    if(value === "foo") {
        return false; // breaks
    }
});

// or

$(selector).each(function() {
  if (condition) {
    return false;
  }
});

3
正是我所需要的,谢谢。@OZZIE,根据你的条件只需使用“return true;”或“return false;”。 - dchayka
2
"@CMS中的“在循环回调中返回false”是什么意思?它具体在哪里?" - mesqueeb
$.each(array, function(key, value) { if(value == "foo") return false; }); - SteveEdson
1
不知道jQuery需要从JavaScript的forEach中交换参数位置。 - Mikee
1
@AlexR 从$().each中跳出的方法完全相同,您的编辑只会导致混淆。 - Jake
@Jake,同意,会编辑答案以便说明你可以同时使用相同的方法。 - Christian C. Salvadó

61

根据文档,return false;应该可以达到这个效果。

我们可以通过使回调函数返回false来终止$.each()循环。

在回调函数中返回false:

function callback(indexInArray, valueOfElement) {
  var booleanKeepGoing;

  this; // == valueOfElement (casted to Object)

  return booleanKeepGoing; // optional, unless false 
                           // and want to stop looping
}

顺便说一句,continue的作用如下:

返回非false值与在for循环中使用continue语句相同,将立即跳到下一次迭代。


40

我遇到了一种情况,满足某个条件后跳出循环,但是在 .each() 函数后的代码仍然执行。所以我设置了一个标志位为“true”,并在 .each() 函数之后立即检查标志位,以确保不再执行后续代码。

$('.groupName').each(function() {
    if($(this).text() == groupname){
        alert('This group already exists');
        breakOut = true;
        return false;
    }
});
if(breakOut) {
    breakOut = false;
    return false;
} 

38

针对这个问题,我创建了一个Fiddle来回答,因为已经接受的答案是不正确的,而且这是谷歌返回的第一个StackOverflow主题与此问题相关。

要退出$.each,必须使用return false;

这里有一个证明它的Fiddle:

http://jsfiddle.net/9XqRy/


19
我喜欢小提琴,但我不确定为什么你说被接受的答案是错误的,因为你们两个都在说同样的事情。 - gitsitgo

16

我知道这是一个比较老的问题,但我没有看到任何回答能够解释为什么和何时可以用return打破循环。

我想用两个简单的例子来解释:

1. 例子: 在这种情况下,我们有一个简单的迭代,如果我们找到了三,我们想用return true来打破循环。

function canFindThree() {
    for(var i = 0; i < 5; i++) {
        if(i === 3) {
           return true;
        }
    }
}

如果我们调用这个函数,它将只会返回true。
2. 示例 在这种情况下,我们想要使用jQuery的each函数进行迭代,该函数接受匿名函数作为参数。
function canFindThree() {

    var result = false;

    $.each([1, 2, 3, 4, 5], function(key, value) { 
        if(value === 3) {
            result = true;
            return false; //This will only exit the anonymous function and stop the iteration immediatelly.
        }
    });

    return result; //This will exit the function with return true;
}

7

"each"使用回调函数。 无论调用函数如何,回调函数都会执行,因此从回调函数返回到调用函数是不可能的。

如果您需要基于某些条件停止循环执行并保留在同一函数中,请使用for循环。


6
我使用这种方法(例如):
$(document).on('click', '#save', function () {
    var cont = true;
    $('.field').each(function () {
        if ($(this).val() === '') {
            alert('Please fill out all fields');
            cont = false;
            return false;
        }
    });
    if (cont === false) {
        return false;
    }
    /* commands block */
});

如果 cont 不是 false,则执行命令块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接