Coffeescript 函数中不带括号的列表理解
我有一个函数需要返回满足条件的对象的最后一个属性:Coffeescript 函数中不带括号的列表理解,coffeescript,Coffeescript,我有一个函数需要返回满足条件的对象的最后一个属性: 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' 怎么了 另外,我知道我可以使用[]访问对象的属性,而不是使用此函
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'
怎么了
另外,我知道我可以使用
[]
访问对象的属性,而不是使用此函数,但这是一个人为的示例。如果我们重新排列代码,那么事情应该会更清楚
您的第二段代码:
console.log v for k, v of types when k is 'b'
g = (s) -> v for k, v of types when k is s
这只是另一种写作方式:
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'
键,因此只进行了一个控制台.log
调用
您的第一段代码:
console.log v for k, v of types when k is 'b'
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代表k,k为s时类型的v
根据定义生成一个数组,因此a
将是一个数组(只有一个元素),而g
将返回一个数组。console.log v代表k,k为“b”时类型的v将调用console.log(v)
对于每个v
当k
满足条件时,而您的第一个被剪断的代码将调用console.log(g(b))
。如果类型
中有两个元素满足条件,则输出为:
[1, 2]
及
要使g
输出满足条件的第一个元素,可以使用return
和early out,或者只获取结果数组的第一个元素
g=(s)->为k返回v,k为s时类型的v