如何跳到jQuery.each()util中的下一个迭代?


434

我正在尝试遍历一系列元素。jQuery的文档说:

jquery.Each()文档

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

我曾尝试称“返回非假”;和“非假”;(无收益),都不会跳到下一个迭代。相反,它们打破了循环。我想念什么?


9
用他们无穷的智慧,jQuery的身体现在已经从文档中删除了此注释-至少,它不在each()页面中。因此,我很高兴看到仍然可以在SO上找到这个问题,并且可以在Google上进行扩展,因为这是我经常忘记的那些简单事情之一:)
Doug McLean 2015年

Answers:


783

他们所说的非假是:

return true;

所以这段代码:

var arr = ["one", "two", "three", "four", "five"];
$.each(arr, function(i) {
  if (arr[i] == 'three') {
    return true;
  }
  console.log(arr[i]);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

将记录onetwofourfive


16
仅退出当前迭代就足以返回“ return”。并退出所有迭代向前返回false。
Saulius

7
值得一说的是,这是有效的,因为执行此代码时您位于函数内。
Ukuser32 '16

当我返回时(arr [i] ==='three'); 为什么它不起作用?
2016年

对我而言,非假的意思是,除了return false之外,您可以返回任何内容;
Hoang Trung '18

61

通过“返回非假”,它们的意思是返回任何无法计算为布尔假的值。所以,你可以返回true1'non-false',或任何其他你能想到的。


20
为什么不只是为了明确起见,“返回'继续'”;
亚历山大·米尔斯

继续呢?在我使用过的C Sharp版本中有效,所以我只是猜测它在JS中会产生类似的效果
Brandito

@Brandito它的运行方式不像普通的循环-它正在递归地调用函数,因此,要使循环继续进行,您需要结束函数内部的处理。
TJ L

5

Javascript具有“真实性”和“虚假性”的概念。如果变量具有值,则通常为9(如您所见),它具有“真实性”-null,或者没有值趋于“虚假”。以下代码片段可能会有所帮助:

var temp1; 
if ( temp1 )...  // false

var temp2 = true;
if ( temp2 )...  // true

var temp3 = "";
if ( temp3 ).... // false

var temp4 = "hello world";
if ( temp4 )...  // true

希望有帮助吗?

另外,值得从道格拉斯·克罗克福德(Douglas Crockford)看这些视频

更新:感谢@cphpython发现断开的链接-我已更新为指向工作版本

Javascript语言

Javascript-好的部分


1
链接断开了……顺便说一句,0它也是一个虚假的值,对它的取反是真实的(例如,反之亦然!-42 === false)。
CPHPython

4

不要忘记,有时您可能只是掉到块的末尾而进入下一个迭代:

$(".row").each( function() {
    if ( ! leaveTheLoop ) {
        ... do stuff here ...
    }
});

而不是像这样实际返回:

$(".row").each( function() {
    if ( leaveTheLoop ) 
        return; //go to next iteration in .each()
    ... do stuff here ...
});

3
我的意思不是无礼,但这是可怕的设计。我的意思是……在我上大学的前两年,我做到了,那时我还不了解(甚至后来我不喜欢它),但我不建议这样做……
xDaizu

@DanielParejoMuñoz,我听到了,但我们不同意。没有return语句的选择可能不是您喜欢的。但是我认为这是一件喜欢/不喜欢的事情,而不是一件好/坏的事情。客观上都没有明显的优势。
Lee Meador

4
这具有增加嵌套的缺点
Dave Cousineau

3

当您按原样返回时,循环才会中断false。例如:

// this is how jquery calls your function
// notice hard comparison (===) against false
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
   break;
}

这意味着您可以返回其他任何内容,包括undefined,如果不返回任何内容,则返回,因此您可以简单地使用空的return语句:

$.each(collection, function (index, item) {
   if (!someTestCondition)
      return; // go to next iteration

   // otherwise do something
});

这可能会因版本而异;这适用于jQuery 1.12.4。但是实际上,当您退出该函数的底部时,您也不返回任何内容,这就是循环继续的原因,因此我希望没有任何返回的任何可能性都无法继续循环。除非他们想迫使大家开始返回的东西,以保持循环下去,什么都不返回要继续下去的方式。


-3

jQuery.noop()可以帮助

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});

不,此noop()函数无济于事。它仅由于未激活“ else”块而起作用。
Rauni Lillemets
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.