24

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

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

结果 = (generate_array(x) for x in arr)

有没有一种优雅的方法来处理这个?感谢您的任何指点!

4

5 回答 5

49

只需使用 JS 成语:

 [].concat.apply([], a)

在咖啡中变得更好一点:

$ 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 ]
于 2011-01-08T00:37:43.437 回答
5

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

除此之外,您可以将 underscore.js 代码用于 flatten 并对其进行修改以删除任何其他下划线依赖项以创建您自己的独立“flatten”。

下面是 underscore.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;
   }, []);
 };

请注意,它正在为您做一些好事。例如,许多像 _.reduce 这样的下划线函数将检查浏览器是否实现了本机版本,有些已经实现。如果是这样,它将使用本机,当然运行速度要快得多。_.isArray 实现做同样的事情。

于 2011-01-08T00:37:28.710 回答
5

咖啡这个怎么样

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

或者这个对于纯Javascript

[[1, 2, 3], [4, 5, 6], [7 , 8, 9]].reduce((a, b) => a.concat(b));
于 2014-05-30T02:15:35.373 回答
0

Sugarjs 是另一种优雅的方式:

[[1, 2, 3]].flatten() //=> [1, 2, 3]

Sugarjs:展平

于 2012-07-06T15:08:54.313 回答
-3

为什么不尝试使用 Lodash?

_.flatten([1,2,3], [4,5,6]) => [1,2,3,4,5,6]

https://lodash.com/docs#flatten

于 2015-06-26T09:39:36.667 回答