2010-10-15 25 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需要一個函數返回一個值?當然包裹在外面的功能。