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

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

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

有一种优雅的方法来处理吗?感谢您的任何指示!

有帮助吗?

解决方案

只需使用JS IDIOM:

 [].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 ]

其他提示

好的,一种方法是包括 下划线 图书馆。这是一个非常漂亮,轻巧但功能强大的实用程序库,它具有_.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实施也可以做同样的事情。

那咖啡呢

[[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));

Sugarjs是另一种优雅的方法:

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

Sugarjs:扁平

为什么不尝试使用lodash?

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

https://lodash.com/docs#flatten

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top