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

Rya*_*nal 41 each jquery nested continue break

请考虑以下代码:

    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;
            }
        });
    });
Run Code Online (Sandbox Code Playgroud)

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

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

如果你想搞砸它,我在jsFiddle上建立了一个例子.只需单击"测试"按钮即可运行上面显示的示例.

TLDR:在jQuery的上下文中是否有类似标记的继续或中断?

Thi*_*ara 92

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

return false;就像break.

只是

return; 就好像 continue

这些将模仿break和continue的行为.

  • 这不会突破*嵌套的*循环. (5认同)

Nic*_*ver 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Ser*_*gan 12

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

return truein jQuery.each是一样的continue

return false 和a一样 break


spi*_*non 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)
}
Run Code Online (Sandbox Code Playgroud)

好吧,让捶打开始吧.

  • 哇.这可能是对try/catch的公然滥用,但它确实有效. (7认同)

Anu*_*rag 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;
});
Run Code Online (Sandbox Code Playgroud)

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


小智 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;
});
Run Code Online (Sandbox Code Playgroud)

这适用于任何嵌套深度.breakout是一个简单的旗帜.它会保留,undefined除非你设置它false(就像我在返回语句中所做的那样).你所要做的就是:

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

不太优雅,对吧?......无论如何......对我有用.