Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套jQuery.each()-继续/中断_Jquery_Nested_Each_Break_Continue - Fatal编程技术网

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

嵌套jQuery.each()-继续/中断,jquery,nested,each,break,continue,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 venen

考虑以下代码:

    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语句),返回non false将停止当前迭代并继续下一次迭代(类似于正常的JavaScript continue语句)

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

如果你想胡闹,我已经安排好了。只需单击“测试”按钮即可运行上面所示的示例

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

您应该在没有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;
        }
    }
}
var语句=[
“Lorem ipsum dolor sit amet,献祭精英”,
“暂时的生活”,
“这是我的名字,欧盟最高法院。”,
“整数id lectus id nunc venenatis gravida nec eget dolor”,
“暂停是不正当的,但只是一种侵权行为。”
];
var words=['ipsum'、'amet'、'elit'];

对于(var s=0;s不幸的是,否。这里的问题是迭代发生在函数内部,因此它们不像普通循环。可以“中断”函数的唯一方法是返回或抛出异常。因此,是的,使用布尔标志似乎是“中断”外部“循环”的唯一合理方法.

没有干净的方法可以做到这一点,就像上面提到的@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)
}

好的,让振荡开始。

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

words
的每个内部迭代都引用相同的
notFound
变量,因此我们只需要在找到匹配项时更新它,然后返回它。外部闭包已经有了对它的引用,因此它可以在需要时断开

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

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

    return notFound;
});

你可以试试你的。

返回true不工作

返回false正在工作

found = false;
query = "foo";

$('.items').each(function()
{
  if($(this).text() == query)
  {
    found = true;
    return false;
  }
});
标记中断
outerloop:
$(句子)。每个(函数()
{
元(字)。每项(功能(一)
{
中断;/*中断内部循环*/
} 
元(字)。每项(功能(一)
{
断开外部循环;/*断开外部循环*/
}
}

如jQuery文档中所述

jQuery中返回true
。每个
与一个
继续


return false
break

相同。这里有很多答案。它是旧的,但这是通过google来到这里的任何人都可以使用的。在jQuery中,每个函数

返回false;
类似于
break

只是

return;
类似于
continue


这些将模拟中断和继续的行为。

API文档中的确认说明:

我们可以通过使 回调函数返回false。返回非false与 for循环中的continue语句;它将立即跳到下一个循环 迭代

这就是我的例子

我使用了“突破”模式:

$(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
(正如我在上面的返回语句中所做的那样)。您所要做的就是:

  • 在最外层的闭包中声明它:
    var breakout;
  • 将其添加到您的
    return false
    语句中:
    return breakout=false
  • 在外部闭合中返回分接头
  • 不太不雅吧?
    …无论如何对我有效。

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


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

    这里的jQuery似乎已经使用完了,一个简单的
    for
    循环将完成您想要的:)这是一个非常简单的例子。事实上,我正在jQuery选定的DOM节点上循环。哇。这可能是对try/catch的公然滥用,但它有效。@Ryan是的,我知道。这完全违背了我们被教导做事情的方式。但我只是想提出一个解决方案。很高兴能提供帮助。惊讶的是,没有任何打击。一定是lig今天是ht,还是我对非最佳实践方法的自我承认。几乎给了你这个方法的检查,但它感觉太脏了:-D严肃地说,虽然是聪明的解决方案。我也喜欢它!这正是为什么我们现在称它为“抛出异常”而不是“提出错误”。只需将“退出错误”改为更为外交的方式“遇到退出条件”或诸如此类的情况,我们已经洗刷了这个概念,并使它在政治上是正确的。:)有人可能会说(如果一个人被赋予旋转篡改),这里的规则是,当
    $(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;
    });