for循环不能正常工作

时间:2016-08-10 11:33:38

标签: node.js coffeescript

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

@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

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

2 个答案:

答案 0 :(得分:0)

好吧,由于某些原因,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

答案 1 :(得分:0)

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];
    ...
}

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