44

考虑以下代码:

    var sentences = [
        'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
        'Vivamus aliquet nisl quis velit ornare tempor.',
        'Cras sit amet neque ante, eu ultrices est.',
        'Integer id lectus id nunc venenatis gravida nec eget dolor.',
        'Suspendisse imperdiet turpis ut justo ultricies a aliquet tortor ultrices.'
    ];

    var words = ['ipsum', 'amet', 'elit'];

    $(sentences).each(function() {
        var s = this;
        alert(s);
        $(words).each(function(i) {
            if (s.indexOf(this) > -1)
            {
                alert('found ' + this);
                return false;
            }
        });
    });

有趣的部分是嵌套的 jQuery.each() 循环。根据文档,返回 false 将跳出循环(停止执行循环 - 类似于正常的 JavaScript break 语句),返回非 false 将停止当前迭代并继续下一次迭代(类似于正常JavaScript continue 语句)。

我可以自行中断或继续 jQuery.each(),但使用嵌套的 jQuery.each,我发现很难从子循环中中断父循环。我可以使用布尔值,并在每次子迭代时更新它,但我想知道是否有更简单的方法。

如果您想弄乱它,我已经在 jsFiddle 设置了一个示例。只需单击“测试”按钮即可运行上面显示的示例。

TLDR:在 jQuery 的上下文中是否有任何类似于标记的 continue 或 break 的东西?

4

11 回答 11

92

这里有很多答案。它很旧,但这适用于通过谷歌来到这里的任何人。在 jQuery 中的每个函数

return false;就像break

只是

return;就好像continue

这些将模拟 break 和 continue 的行为。

于 2012-10-11T09:17:51.580 回答
22

您应该在没有jQuery 的情况下执行此操作,它可能不像“漂亮”那样“漂亮”,但发生的事情更少,而且更容易完全按照您的意愿进行操作,如下所示:

var sentences = [
    'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
    'Vivamus aliquet nisl quis velit ornare tempor.',
    'Cras sit amet neque ante, eu ultrices est.',
    'Integer id lectus id nunc venenatis gravida nec eget dolor.',
    'Suspendisse imperdiet turpis ut justo ultricies a aliquet tortor ultrices.'
];

var words = ['ipsum', 'amet', 'elit'];

for(var s=0; s<sentences.length; s++) {
    alert(sentences[s]);
    for(var w=0; w<words.length; w++) {
        if(sentences[s].indexOf(words[w]) > -1) {
            alert('found ' + words[w]);
            return;
        }
    }
}

你可以在这里试试。我不确定这是否是您所追求的确切行为,但现在您不在由 double 创建的闭包内的闭包中,在这种情况下.each()您可以return或随时需要。break

于 2010-07-16T17:50:23.913 回答
12

如 jQuery 文档http://api.jquery.com/jQuery.each/中所述

return trueinjQuery.each与 a 相同continue

return false是一样的break

于 2012-08-16T15:31:44.343 回答
8

没有干净的方法可以做到这一点,就像上面提到的@Nick 一样,使用老派的循环方式可能更容易,因为你可以控制它。但是如果你想坚持你所得到的,有一种方法可以解决这个问题。我相信我会为这个得到一些热量。但...

在没有 if 语句的情况下你可以做你想做的事情的一种方法是引发错误并用 try/catch 块包装你的循环:

try{
$(sentences).each(function() {
    var s = this;
    alert(s);
    $(words).each(function(i) {
        if (s.indexOf(this) > -1)
        {
            alert('found ' + this);
            throw "Exit Error";
        }
    });
});
}
catch (e)
{
    alert(e)
}

好的,让鞭打开始。

于 2010-07-16T17:55:41.693 回答
8

这里的问题是,虽然您可以从.each回调中返回 false,但.each函数本身返回的是 jQuery 对象。因此,您必须在两个级别都返回 false 以停止循环的迭代。此外,由于无法知道内部是否.each找到匹配项,我们将不得不使用一个共享变量,使用一个更新的闭包。

的每个内部迭代都words引用同一个notFound变量,所以我们只需要在找到匹配项时更新它,然后返回它。外部闭包已经引用了它,所以它可以break在需要时取出。

$(sentences).each(function() {
    var s = this;
    var notFound = true;

    $(words).each(function() {
        return (notFound = (s.indexOf(this) == -1));
    });

    return notFound;
});

你可以在这里试试你的例子

于 2010-07-16T17:59:13.417 回答
6

我为此使用了“突破”模式:

$(sentences).each(function() {
    var breakout;
    var s = this;
    alert(s);
    $(words).each(function(i) {
        if (s.indexOf(this) > -1)
        {
            alert('found ' + this);
            return breakout = false;
        }
    });
    return breakout;
});

这适用于任何嵌套深度。breakout是一个简单的标志。undefined除非您将其设置为,否则它将一直存在false(正如我在我的 return 语句中所做的那样,如上图所示)。你所要做的就是:

  1. 在最外面的闭包中声明它:var breakout;
  2. 将其添加到您的return false声明中:return breakout = false
  3. 在您的外部封闭件中返回突破。

不会太不雅吧?...无论如何对我有用。

于 2014-04-02T03:59:32.970 回答
3

很不幸的是,不行。这里的问题是迭代发生在函数内部,所以它们不像正常循环。您可以“打破”函数的唯一方法是返回或抛出异常。所以是的,使用布尔标志似乎是“打破”外部“循环”的唯一合理方法。

于 2010-07-16T17:50:39.627 回答
3

返回 true不起作用

返回虚假工作

found = false;
query = "foo";

$('.items').each(function()
{
  if($(this).text() == query)
  {
    found = true;
    return false;
  }
});
于 2011-03-18T00:23:42.333 回答
2

标记中断

outerloop:
$(sentences).each(function() 
{
    $(words).each(function(i) 
    {
        break; /* breaks inner loop */
    } 
    $(words).each(function(i)  
    {
        break outerloop; /* breaks outer loop */
    }
}
于 2012-05-15T14:29:46.820 回答
2

在 API 文档http://api.jquery.com/jQuery.each/中确认说:

通过使回调函数返回 false,我们可以在特定迭代中打破 $.each() 循环。返回非 false 与 for 循环中的 continue 语句相同;它将立即跳到下一次迭代。

这是我的例子http://jsfiddle.net/r6jqP/

(function($){
    $('#go').on('click',function(){
        var i=0,
            all=0;
        $('li').each(function(){
             all++;
             if($('#mytext').val()=='continue')return true;
             i++;
             if($('#mytext').val()==$(this).html()){
                 return false;
             }
        });
        alert('Iterazione : '+i+' to '+all);
    });
}(jQuery));
于 2013-06-15T12:53:24.120 回答
0

$.each()您可以通过使回调函数返回 false 来在特定迭代中中断循环。

返回非 false 与continuefor 循环中的语句相同;它将立即跳到下一次迭代。

于 2020-03-11T15:26:15.553 回答