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