如何打破 .each() 并为函数返回一个值

52
我想在使用 .each() 方法时,同时中止循环并返回一个值。我可以使用 return false 来中止循环,但如何同时返回值呢?
请参考一个解决方案函数以了解我的意图:
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;
}

它已经在这样做了!看看我的例子http://jsfiddle.net/aXkcW/ - BrunoLM
这是我在SO上找到的第一个答案,它就在OP提出的问题里哈哈。 - NecipAllef
8个回答

44

10
那并没有回答这个问题。他还想在返回false之后返回一个值,即区分“返回false”和简单终止循环的情况。 - Ariel
@Ariel,https://jsbin.com/tonozu/edit?html,js,console 怎么样?如果满足条件(就像OP的伪代码所要求的那样),返回值为“true”,并且跳出循环。 - Šime Vidas
@ŠimeVidas 那个(JS,而不是JQ,“some”方法)完全无关紧要。我很惊讶这个答案有36个赞(!)并且仍然是被接受的答案(因为OP可以更改)。请看看我的答案。 - mike rodent
@mikerodent,我不理解你的回答。从我的角度来看,OP需要一个函数来检查一个jQuery集合是否包含具有给定“state”值的元素。 - Šime Vidas

16

要有创意:

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

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


5
我很不愿意给这个点赞...但是我真的很喜欢这种有创意的想法^^ - Levite
我记不清JS中关于将异常用作常规代码技术的“正统”观点是什么了。某些语言的“大师”曾经尝试过这个想法……但对于像我这样的简单人来说,我倾向于认为“只有在异常情况下才使用异常”,或者“当代码对某些东西感到异常时,抛出异常”。唯一的例外可能是当其他替代方案过于复杂时。但这在这里并非如此。避免这种异常使用的一个实际原因是您不知道处理它们所涉及的开销。 - mike rodent

14

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

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);

你目前使用的方法是正确的。 我已在 jsFiddle 上进行了测试,这里可以看到一个示例.

对你来说不起作用吗?能否展示更多上下文?


5

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


2
如何?
$.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(...实际返回的内容感兴趣。正如相关JQ页面上所说,"该方法返回它的第一个参数,即被迭代的对象",但事实上,解决方案甚至不需要你使用这个事实...

PPS 需要返回值的函数?当然要包装在外部函数中。


2
你所建议的方法是正确的。我认为它不应该被视为一种变通方法,而应该被视为一种惯用语。

1

好的,我想这一点可能有些疑问,所以我在这里让它更清晰:

  • 当jQuery文档说:“我们可以通过在回调函数中返回false来停止循环。”并且你写了:

    Function () { for() { if found { return true; }
    } return 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 - 简单!

0

正如其他人从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;
}

当然,使用双重否定有点愚蠢,并且会导致在每次假迭代和反之下将“true”保存到statehasstores中,但最终结果应该是相同的,而且您不再需要if语句。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接