循环遍历循环并在满足条件时中断

时间:2012-06-04 03:18:50

标签: jquery backbone.js coffeescript break

我使用jQuery循环遍历数组并将每个值与模型的用户ID进行比较。如果找到匹配项,我将只显示特定文本。

$.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"

但是我的代码无效,它总是返回“跟随”文本。我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

据推测,current_user.get('following_ids')是某种ID数组。立即想到两种可能性:

  1. current_user.get('following_ids')不包含@model.get('user')._id,因此一切正常运作。
  2. 您遇到类型问题。也许following_ids是一个字符串数组,_id是一个数字,反之亦然。
  3. 选项 2 需要更多解释:CoffeeScript的==转换为JavaScript的===,因此在CoffeeScript中1 == '1'为false,但在JavaScript中为true。这确实使 2 成为 1 的一个隐藏且可能令人惊讶的变体,但它特别适合自己的情况。

    考虑一下这种情况的简化类比:

    $.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结果:http://jsfiddle.net/ambiguous/CxHXu/


    在任何情况下,由于您使用的是Backbone,因此您可以使用Underscore,因此您可以使用_.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
    

    你仍然需要解决类型问题。

答案 1 :(得分: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"