2016-05-08 55 views
0

我的代碼中存在邏輯問題。當通過if條件時退出foreach

object.forEach(function(item) { 
    if (item.a === $scope.a) { 
    //doSomething 
    } 
    else { 
    //doOtherStuff 
} 
}); 

所以,基本上,我想運行該對象,並比較$範圍是否存在於對象內部。如果存在$ scope,則執行某些操作並退出forEach,否則,執行其他操作並退出。如何才能做到這一點?

我的邏輯問題是它運行在forEach內部,對於每個索引,都在做某件事情。也許我必須使用另一種我還不知道的方法,你能幫助我嗎?

+1

這個答案可能會幫助你: http://stackoverflow.com/questions/13843972/angular-js-break-foreach –

+0

我希望你聲明的名稱'object'實際上是一個數組。 – Redu

+0

在兩種情況下(條件爲false)都有些奇怪,這實際上意味着您將永遠不會真正迭代,但僅僅只想對第一個項目執行操作。那麼問題是:爲什麼你要使用'forEach',而不是隻選擇第一個元素並在其上執行邏輯? – trincot

回答

2

使用,而不是every

Object.keys(object).every(function(item) { 
    if (some_exit_condition) { 
     return false; // don't call this callback again for next items 
    else { 
     // don't stop, keep going 
     return true; 
    } 
}); 

如果object是一個類似數組的對象(迭代器),你不需要調用Object.keys()就可以了。這取決於你想要迭代的內容。使用Object.keys(),您可以迭代該對象的所有屬性,並在回調函數內寫入object[item]以獲取該屬性的值。

方法some具有相似的行爲,但您必須返回true停止迭代,並且false繼續。

every()some()都有一個布爾返回值,它們也將它們與forEach()區分開來。有了這個返回值,你可以知道是否有明確的「退出」。

+0

是的,''每個'都適用於算法的特定行爲,這個問題已經解決了一半,謝謝! –

+0

不客氣。 – trincot

0

也許你可以使用array.prototype.filter()簡化你的代碼。

您可以查看更多信息here

你有兼容ie9,但我認爲應該有一個jQuery的功能,可以做到這一點。