在函数中没有括号的列表理解

时间:2014-07-09 20:40:16

标签: 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'

有什么问题?

P.S。我知道我可以使用[]访问对象的属性,而不是这个函数,但这是一个人为的例子。

2 个答案:

答案 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