我有一个函数需要返回满足条件的对象的最后一个属性:
types = {
a: 1,
b: 2,
c: 3
}
g = (s) -> v for k, v of types when k is s
console.log g 'b'
此代码打印[ 2 ]
我只期望2
,而不是数组。事实上,这段代码确实打印了我期望的内容:
console.log v for k, v of types when k is 'b'
有什么问题?
P.S。我知道我可以使用[]
访问对象的属性,而不是这个函数,但这是一个人为的例子。
答案 0 :(得分:1)
如果我们重新安排代码,那么事情应该更清楚。
你的第二段代码:
console.log v for k, v of types when k is 'b'
只是另一种写作方式:
for k, v of types when k is 'b'
console.log(v)
甚至:
for k, v of types
if k is 'b'
console.log(v)
由于只有一个'b'
密钥,因此只能进行一次console.log
次呼叫。
你的第一段代码:
g = (s) -> v for k, v of types when k is s
与此相同:
g = (s) ->
a = (v for k, v of types when k is s)
a
循环,v for k, v of types when k is s
按定义生成一个数组,因此a
将是一个数组(只有一个元素),g
将返回一个数组。
答案 1 :(得分:1)
console.log v for k, v of types when k is 'b'
满足条件时, console.log(v)
会针对每个v
致电k
,而您剪下的第一个代码会调用console.log(g(b))
。如果types
中有两个元素满足条件,则输出为:
[1, 2]
和
1
2
要使g
输出满足条件的第一个元素,可以提前使用return
或者只取结果数组的第一个元素。
g = (s) -> return v for k, v of types when k is s