【问题标题】:for loop not working as excpectedfor 循环没有按预期工作
【发布时间】:2016-08-11 00:57:52
【问题描述】:

我有一个类,有一个像这样的变量:

@tags = { 'tag-test': [ 'ZnVuY3Rpb24gcmFuZG9tKCkgeyBbbmF0aXZlIGNvZGVdIH0xNDcwODI4MzQ4Mzk3TmFO' ] }

现在我正在尝试检查所有索引,然后删除其中一个值(如果有):

rmtag = (t) ->
    i = @tags[t].indexOf socket.uid
    console.log "Checking tag " + t + " index is " + i
    if i != -1
        console.log "Removing " + i
        @tags[t].splice i, 1

rmtag = rmtag.bind @

for d, i in @tags
    rmtag i

在这种情况下,socket.uid 的值为 ZnVuY3Rpb24gcmFuZG9tKCkgeyBbbmF0aXZlIGNvZGVdIH0xNDcwODI4MzQ4Mzk3TmFO

关于为什么这不起作用的任何想法?

【问题讨论】:

  • 也许最好的方法是使用过滤器,例如tags[i].filter((tag) => tag != socket.uid )?
  • 出于某种原因,for 循环甚至没有执行一次。如果我在for循环之前console.log @tags,它有一个条目。

标签: node.js coffeescript


【解决方案1】:

好吧,由于某种原因,for 循环没有被执行。无论如何,首先列出键然后检查它们可以按预期工作:

tags = @tags

# Remove entry from all tags
rmtag = (t) ->
    @tags[t] = @tags[t].filter((tag) => tag != socket.uid)

rmtag = rmtag.bind @
keys = Object.keys tags
for k in keys
    rmtag k

【讨论】:

    【解决方案2】:

    for ... in 用于循环数组,但@tags 是一个对象。您使用for ... of 循环对象:

    for k, v of @tags
        rmtag k
    

    如果你说for d, i in tags,CoffeeScript 会生成这样的 JavaScript:

    for (i = j = 0, len = tags.length; j < len; i = ++j) {
        d = tags[i];
        ...
    }
    

    但是您在@tags 中没有length 属性,因此j &lt; len 条件立即失败并且循环永远不会执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 2017-03-29
      相关资源
      最近更新 更多