CoffeeScript中的嵌套数组解析

时间:2011-04-16 08:59:16

标签: coffeescript list-comprehension

在Python中

def cross(A, B):
   "Cross product of elements in A and elements in B."
   return [a+b for a in A for b in B]
如果用两个数组(或字符串)调用它,

会返回一维数组。

但是在CoffeeScript中

cross = (A, B) -> (a+b for a in A for b in B)

返回一个二维数组。

  1. 你认为它是CoffeeScript中的设计还是一个bug?
  2. 如何在CoffeScript中展平数组?

2 个答案:

答案 0 :(得分:17)

首先我要说的是,2行阵列理解不是一个非常可维护的模式。所以让我们分解一下。

cross = (A, B) ->
  for a in A
    for b in B
      a+b

alert JSON.stringify(cross [1,2], [3,4])

这里发生的是内在创造一个闭包,它有自己的理解收集器。所以它运行所有的b,然后将结果作为一个数组返回到父母理解结果收集器。你有点期待内循环的返回值,这有点时髦。

相反,我只是自己收集结果。

cross = (A, B) ->
  results = []
  for a in A
    for b in B
      results.push a + b
  results

alert JSON.stringify(cross [1,2], [3,4])

或者如果你还想做一些疯狂的理解魔术:

cross = (A, B) ->
  results = []
  results = results.concat a+b for b in B for a in A
  results

alert JSON.stringify(cross [1,2], [3,4])

我想,这是否是CS中的错误有点值得商榷。但我认为在处理嵌套迭代器时进行更明确的理解结果处理是一种好习惯。

答案 1 :(得分:7)