【问题标题】:How to break out of .each() and return a value for a function如何突破 .each() 并返回函数的值
【发布时间】:2011-04-26 04:09:11
【问题描述】:

我想使用return false 来破坏 .each() 但同时也返回一个值。我该怎么做?

请参考一个变通功能,看看我想要做什么:

function HasStores(state) {
    var statehasstores = false;

    $(stores).each(function (index, store) {
        if (state == store.state && store.category == "meyers") {
            statehasstores = true;
            return false;  // break
        }
    });

    return statehasstores;
}

我喜欢用伪代码做的是:

Function () {
    for() {
        if found {
            return true;
        }   
    }
    return false;
}

【问题讨论】:

  • 它已经在这样做了!看我的例子jsfiddle.net/aXkcW
  • 这是 SO 中的第一个,我在 OP 提出的问题中找到了我正在寻找的答案,哈哈

标签: javascript jquery


【解决方案1】:

你做得对……

引用http://api.jquery.com/each/

“我们可以通过返回 false 从回调函数中停止循环。”

【讨论】:

  • 这不能回答问题。他还想在返回false后返回一个值,即区分return false和简单的终止循环。
  • @Ariel jsbin.com/tonozu/edit?html,js,console 怎么样?如果满足条件,则返回值为true(就像 OP 的伪代码要求一样),并跳出循环。
  • @ŠimeVidas 那(JS,不是 JQ,some 方法)完全无关紧要。我很惊讶这个答案有 36 个(!)赞成票并且仍然是公认的答案(因为 OP 可以改变它)。请看我的回答。
  • @mikerodent 我不明白你的回答。据我所知,OP 需要一个函数来检查 jQuery 集合是否包含具有给定 state 值的元素。
【解决方案2】:

要有创意:

try {
  $(stores).each(function (index, store) {
    if(state == store.state && store.category == "meyers"){
      throw store;
    }
  });
}
catch(e) {
  // you got e with the value
}

不,我只是在开玩笑,不要使用这个 :)。这是我喜欢分享的一个想法。

【讨论】:

  • 我真的很难赞成这个......但我真的很喜欢这个创造性的想法^^
  • 我不记得目前在 JS 中关于使用异常作为常规代码技术的“正统”观点是什么。某些语言的“大师”在某些时候已经涉足过这个想法......但对我来说,作为一个简单的人,我倾向于认为“异常情况下的异常”,或者“当代码对某事产生异常时,抛出异常” .一个,嗯,例外情况可能是替代方案过于复杂。但这里不是这样。避免使用这种异常的一个实际原因是您不知道处理它们所涉及的开销。
【解决方案3】:

在循环外使用变量来获取值并在之后使用它。

var value;

$(stores).each(function (index, store) {
    if(state == store.state && store.category == "meyers"){
        statehasstores = true;
        value = store; // added line
        return false; //break
    }
});

alert(value);

你的做法很好。 I've tested on jsFiddle, see an example here

它不适合你?你能显示更多上下文吗?

【讨论】:

    【解决方案4】:

    或者,您可以使用for 循环而不是each(),然后只返回值。

    【讨论】:

      【解决方案5】:

      您建议的是这样做的方法。我认为它不是一种解决方法,而是一种习惯用法。

      【讨论】:

        【解决方案6】:

        怎么样:

        $.each( myObj, function( key, value ){
          ...
          if( sthg... ){
            myObj.somethingWentHorriblyWrong = true;
            return false;
          }
        });
        
        if( myObj.somethingWentHorriblyWrong ){
          // ... do something, not forgetting to go:
          delete myObj.somethingWentHorriblyWrong;
        }
        

        PS 我最初对$.each(... 实际返回的内容感兴趣。正如relevant JQ page 上所说,“该方法返回其第一个参数,即被迭代的对象”,但实际上该解决方案甚至不需要您使用该事实...

        PPS 需要一个返回值的函数吗?当然包裹在一个外部函数中。

        【讨论】:

          【解决方案7】:

          好吧,我想这点有点怀疑,所以也许我在这里说得更清楚:

          • 当 jquery doc 说:“我们可以通过返回 false 从回调函数中停止循环。”你这样做:

            函数 () { 为了() { 如果找到{ 返回真; }
            } 返回假; }

          这并不意味着你的函数在找到搜索到的元素时会返回 true。相反,它总是返回 false。

          所以为了让你的功能按照我的建议工作:

          Function () {
             variable found = false;
          foreach() {
              if found {
                  found = true;
                  return false; // This statement doesn't make your function return false but just cut the loop
              }   
          }
          return found;
          

          }

          当然还有很多其他方法可以做到这一点,但我认为这是最简单的一种。

          Coopa - 简单!

          【讨论】:

            【解决方案8】:

            正如其他人在jQuery Each 中指出的那样,返回 false 只会从循环中中断而不返回值,但返回 true 将“继续”并立即开始下一次迭代。有了这些知识,您就可以像这样简化您的代码:

            function HasStores(state) {
              var statehasstores = false;
            
              $(stores).each(function (index, store){
            
                // continue or break;
                statehasstores = !(state == store.state && store.category == "meyers"))
                return statehasstores;
              });
            
              return !statehasstores;
            }
            

            这当然有点傻,使用双重否定,并且具有为每次错误迭代将“真”保存到 statehasstores 的副作用,反之亦然,但是最终结果应该是相同的,如果声明。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-02-05
              • 2011-10-19
              • 2012-09-10
              • 2016-06-26
              • 2023-04-04
              • 2013-06-18
              • 2011-09-12
              相关资源
              最近更新 更多