2010-10-15 53 views
37

我想使用return false来破坏.each(),但同时也返回一个值。我怎样才能做到这一点?如何突破.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; 
} 
+0

它已经这样做了!看看我的例子http://jsfiddle.net/aXkcW/ – BrunoLM 2010-10-15 23:09:19

+0

这是第一次,所以我找到了答案,我正在寻找内部问题OP问大声笑 – NecipAllef 2016-11-12 08:37:33

回答

37

你这样做是正确的...

报价从http://api.jquery.com/each/

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

+5

这并没有回答这个问题。他还想在返回false后返回一个值,即区分'return false'和简单地终止循环。 – Ariel 2016-06-26 23:57:18

+0

@Ariel https://jsbin.com/tonozu/edit?html,js,console怎么样?如果满足条件,则返回值为“真”(就像OP的伪代码命令一样),并且它跳出循环。 – 2016-06-27 00:08:38

+0

@ŠimeVidas(JS,而不是JQ,'''方法)是完全不相关的。我很惊讶这个答案有36(!)upvotes并且仍然是被接受的答案(因为OP可以改变它)。请看我的答案。 – 2017-08-26 18:49:17

2

你是在暗示什么是做到这一点的方法。我不认为它是一种解决方法,更像一个成语。

4

或者,您可以使用for循环代替each(),然后返回该值。

+0

这也会使代码更具可读性。 – reformed 2016-09-27 22:07:41

9

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

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

这不适合你吗?你能展示更多的上下文吗?

11

有创意:

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

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

+0

我喜欢这个主意。 :P – BrunoLM 2010-10-15 22:51:09

+3

我觉得这真的很糟糕......但我真的很喜欢这个创造性的想法^^ – Levit 2015-09-23 08:39:38

+0

我不记得目前JS在JS中使用例外代码技术的“正统”视图。在某些时候某些语言的“大师”已经涉足这个想法......但对于我来说,作为一个傻瓜,我倾向于认为“例外情况”,或者“当代码对某事做出异常时抛出异常” 。唯一的例外是,当替代品太复杂时。但这不是这种情况。避免这种使用例外的一个实际原因是,您不知道处理它们所涉及的开销。 – 2017-08-26 19:11:55

1

好吧,我想有这点有点疑问,也许我正在做更清晰的位置:

  • 当jQuery的医生说:“我们可以通过返回false从回调函数中停止循环“。并且你这样做:

    功能(){ for(){ if 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将返回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每一个虚假的迭代和副副作用相反,但最终的结果应该是相同的,你不再有这个if语句。

0

如何:

$.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需要一个函数返回一个值?当然包裹在外面的功能。