2012-06-04 88 views
2

我正在使用jQuery循環訪問數組,並將每個值與模型的用戶標識進行比較。如果找到匹配項,我將只顯示特定的文本。錯誤循環遍歷循環並在條件滿足時中斷

$.each current_user.get('following_ids'), (i, e) => 
    console.log(@model.get('user')._id == e) 
    if @model.get('user')._id == e 
    @is_following = true 
    //break from loop if condition is met 
    return false 
    else 
    @is_following = false 
    //else continue looping through 
    return true 

if @is_following 
    $(@el).find('.user_info .follow a').text "following" 
else 
    $(@el).find('.user_info .follow a').text "follow" 

但是我的代碼不工作,它總是返回我「跟隨」文本。我在這裏做錯了什麼?

回答

1

推測current_user.get('following_ids')是某種ID的數組。立即想到兩種可能性:

  1. current_user.get('following_ids')不包含@model.get('user')._id所以一切都按預期工作。
  2. 您有類型問題。也許following_ids是一串字符串,_id是一個數字,反之亦然。

選項需要多一點的解釋:CoffeeScript中的==轉換爲JavaScript的===所以1 == '1'是假的CoffeeScript但在JavaScript中真實的。這確實使是一個隱藏的和可能令人驚訝的變體但它是足夠特殊的是它自己的情況。

考慮你的情況這簡化模擬:

$.each ['1','2','3'], (i, e) => 
    if 2 == e 
     @is_following = true 
     return false 
    else 
     @is_following = false 
     return true 
console.log @is_following 

你會得到false出來的,由於2 == '2'false是CoffeeScript的:http://jsfiddle.net/ambiguous/YsstH/

但是,如果我們固定類型:

$.each [1,2,3], (i, e) => 
    # Only the array changes... 
console.log @is_following 

然後我們得到true結果,我們期待NG:http://jsfiddle.net/ambiguous/CxHXu/


在任何情況下,由於您使用的骨幹,你有下劃線,所以你可以只使用_.any

@is_following = _(current_user.get('following_ids')).any (id) => @model.get('user')._id == id 

或更好:

want_this_id = @model.get('user')._id 
@is_following = _(current_user.get('following_ids')).any (id) -> want_this_id == id 

你」但仍然需要梳理類型問題。

+0

我希望我可以upvote你的答案多次。謝謝你打在頭上的釘子!還愛你的替代解決方案,非常乾淨和高效。非常感謝! – Zhen

+0

@珍:不用擔心,有時我喜歡拼圖:) –

0

很有可能在找到匹配項後覆蓋結果。如果您找到了匹配,則無需繼續檢查。

$.each current_user.get('following_ids'), (i, e) => 
    unless @is_following 
    console.log(@model.get('user')._id == e) 
    if @model.get('user')._id == e 
     @is_following = true 
     //break from loop if condition is met 
     return false 
    else 
     @is_following = false 
     //else continue looping through 
     return true 

if @is_following 
    $(@el).find('.user_info .follow a').text "following" 
else 
    $(@el).find('.user_info .follow a').text "follow" 
+0

並且爲了記錄,'false'不會中斷 - 'break'會。 – Swift

+0

對於記錄來說,'false'確實會破壞:[「我們可以通過使回調函數返回false來破壞'$ .each()'循環。](http://api.jquery.com /jQuery.each/) –

+0

如果我使用'break',我得到一個錯誤 – Zhen