在Coffeescript中连接数组数组

drc*_*ode 24 arrays coffeescript

我试图在Coffeescript中找到一种优雅的方式来合并一个数组,这样[[1,2,3],[4,5,6],[7,8,9]] ==> [1 ,2,3,4,5,6,7,8,9].

正如您可能想象的那样,我需要这个,因为我正在从"for in"构造中的函数生成数组,并且需要连接生成的嵌套数组:

result =(arr中x的generate_array(x))

有一种优雅的方式来处理这个问题吗?感谢您的任何指示!

mat*_*tyr 49

只需使用JS习语:

 [].concat.apply([], a)
Run Code Online (Sandbox Code Playgroud)

在咖啡中变得更好一些:

$ coffee -e 'a = [[1,2,3],[4,5,6],[7,8,9]]; console.dir [].concat a...'
[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
Run Code Online (Sandbox Code Playgroud)

  • 对于像我这样没有立刻得到它的人,`apply`的第二个参数是一个列表,其中列表中的每个项都成为传递给函数的参数.所以对于[[1,2,3],[4,5,6],[7,8,9],你实际上是在调用[] .concat([1,2,3],[4,5,6] ],[7,8,9]). (11认同)
  • 警告的话 - 如果你的数组足够大(可能是数百万个元素?),你可能会导致堆栈溢出. (2认同)

Cha*_*ers 5

好的,一种方法是包含underscore.js库.它是一个非常好的,轻量级但功能强大的实用程序库,它有_.flatten就是这样做的.

除此之外,您可以使用underscore.js代码进行展平并修改它以删除任何其他下划线依赖项以创建您自己的独立"展平".

这是下划线.js"_.flatten"代码:

 _.flatten = function(array) {
   return _.reduce(array, function(memo, value) {
     if (_.isArray(value)) return memo.concat(_.flatten(value));
     memo[memo.length] = value;
     return memo;
   }, []);
 };
Run Code Online (Sandbox Code Playgroud)

请注意,它正在为您做一些不错的事情.例如,许多下划线函数(如_.reduce)将检查浏览器是否已实现某些本机版本.如果是这样,它将使用本机,当然运行速度更快._.isArray实现做同样的事情.


the*_*fer 5

咖啡怎么样?

[[1, 2, 3], [4, 5, 6], [7, 8, 9]].reduce (a, b) ->
  a.concat b
Run Code Online (Sandbox Code Playgroud)

或者这是纯粹的Javascript

[[1, 2, 3], [4, 5, 6], [7 , 8, 9]].reduce((a, b) => a.concat(b));
Run Code Online (Sandbox Code Playgroud)