【问题标题】:Function Returns Incorrect Value in the Middle of jQuery Each Loop函数在jQuery每个循环中间返回不正确的值
【发布时间】:2018-04-25 07:46:06
【问题描述】:

我想在 jQuery Each Loop 中间立即返回时遇到了奇怪的行为,我的期望是,下面的函数应该返回 TRUE(条件匹配)。但我仍然得到 FALSE。这在 Java 中可以工作,但在 JS/jQuery 中不起作用?

function returnFromLoop(eventIDs) {

   jQuery.each(eventIDs, function(index, item) {
       if (item.indexOf("TEST") != -1) {
           return true;
       }
   
   });
   return false;
}

var eventIDs = [];
eventIDs.push('abc');
eventIDs.push('defTEST');
eventIDs.push('ghi');

var result = returnFromLoop(eventIDs);
console.log('result = ' + result);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【问题讨论】:

  • return true; 语句在.each() 回调函数中,因此它只会影响它。它不会从外部函数返回。
  • 并且没有办法在保持这种语法的同时强制函数返回?
  • 附带说明,您应该考虑使用更现代的 JS。浏览器支持是个问题,但新的 Array 函数都可以很容易地填充以提供 IE 向后兼容性,即使没有像 Babel 这样复杂的构建链工具。您可以在没有 jQuery 的情况下完成上述操作,只需使用 return eventIDs.includes(id => item.includes("TEST")) 作为函数体。

标签: javascript jquery


【解决方案1】:

问题是你试图返回两个函数,所以我使用了一个额外的变量来解决。 return true 充当 continue 类型,因此您需要返回 false。 https://stackoverflow.com/a/8224424/6517383将帮助您了解更多。

function returnFromLoop(eventIDs) {
   var state = 0;
   jQuery.each(eventIDs, function(index, item) {
       if (item.indexOf("TEST") != -1) {
            state = 1;
            return 1;
       }
   });
   if(state == 1) {
      return true;
   }
   return false;
}

var eventIDs = [];
eventIDs.push('abc');
eventIDs.push('defTEST');
eventIDs.push('ghi');

var result = returnFromLoop(eventIDs);
console.log('result = ' + result);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

    【解决方案2】:

    jQuery 的 .each() 方法中的 return true 不会跳出循环。相反,您可以使用return false 跳出循环。

    然后,为了捕获返回值,可以使用变量。在下面的 sn-p 中,我使用了变量 returnValue。退出循环后,您可以返回该变量。

    来自http://api.jquery.com/jQuery.each/

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

    function returnFromLoop(eventIDs) {
      var returnValue = false;
      jQuery.each(eventIDs, function(index, item) {
        if (item.indexOf("TEST") != -1) {
          returnValue = true;
          return false; // Equivalent to break statement.
        }
      });
      return returnValue;
    }
    
    var eventIDs = [];
    eventIDs.push('abc');
    eventIDs.push('defTEST');
    eventIDs.push('ghi');
    
    var result = returnFromLoop(eventIDs);
    console.log('result = ' + result);
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    【讨论】:

    • 谢谢 这个语法太混乱了,所以我会用 For-loop 重写并避免使用 jQuery Each。
    • @geneb。请查看Array#some - 查看您的代码,看来您可以使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2020-02-08
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    相关资源
    最近更新 更多