嵌套的jQuery.each() - 继续/中断

时间:2010-07-16 17:45:24

标签: jquery nested each break continue

请考虑以下代码:

    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()循环。根据{{​​3}},返回false将跳出循环(停止执行循环 - 类似于正常的JavaScript break语句),返回非false将停止当前迭代并继续下一次迭代(类似)到正常的JavaScript继续声明)。

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

如果您想要搞清楚,我已经设置了the documentation。只需单击“测试”按钮即可运行上面显示的示例。

TLDR:在jQuery的上下文中是否有类似标记为continue或break的内容?

11 个答案:

答案 0 :(得分:91)

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

return false;break类似。

只是

return;continue

类似

这些将模仿break的行为并继续。

答案 1 :(得分: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;
        }
    }
}

You can try it out here。我不确定这是否是您所追求的完全行为,但现在您不在由双.each()创建的闭包内的闭包中,您可以{{1在这种情况下,只要你想要的话,就可以使用return

答案 2 :(得分:12)

正如jQuery文档http://api.jquery.com/jQuery.each/

中所述 return true中的

jQuery.eachcontinue

相同

return falsebreak

相同

答案 3 :(得分: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)
}

好的,让捶打开始。

答案 4 :(得分:7)

这里的问题是,虽然你可以在.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;
});

您可以尝试example here

答案 5 :(得分:5)

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

$(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。您所要做的就是:

  1. 在最外面的封口中声明它:var breakout;
  2. 将其添加到您的return false语句中:return breakout = false
  3. 在你的外部封闭中返回突破。
  4. 不太优雅,对吧? ......无论如何......对我有用。

答案 6 :(得分:3)

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

答案 7 :(得分:3)

返回true 无法正常工作

返回错误正常工作

found = false;
query = "foo";

$('.items').each(function()
{
  if($(this).text() == query)
  {
    found = true;
    return false;
  }
});

答案 8 :(得分:3)

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

  

我们可以在特定的迭代中打破$ .each()循环   回调函数返回false。返回非假是与a相同   在for循环中继续声明;它将立即跳到下一个   迭代。

这是我的例子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));

答案 9 :(得分:2)

标记休息

outerloop:
$(sentences).each(function() 
{
    $(words).each(function(i) 
    {
        break; /* breaks inner loop */
    } 
    $(words).each(function(i)  
    {
        break outerloop; /* breaks outer loop */
    }
}

答案 10 :(得分:1)

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

返回非false与for循环中的continue语句相同;它将立即跳至下一个迭代。