我有一个类,有一个像这样的变量:
@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
。
关于为什么这不起作用的任何想法?
答案 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
条件会立即失败并且循环永远不会执行。