2011-01-08 59 views
23

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

正如你可能想象,我需要这个因为我从函数产生阵列的“对”构造和需要连接所得的嵌套数组:

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

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

回答

47

只需使用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 ] 
+0

不错。不知道它会如此简洁。谢谢。 – 2011-01-08 00:41:06

+0

成语是辉煌的 - 感谢让我意识到它! – drcode 2011-01-08 00:41:46

5

好的,一种方法是包含underscore.js库。这是一个非常好的,轻量级但功能强大的实用程序库,它具有_.flatten完成此操作。

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

这里的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实现执行相同的操作。

0

sugarjs是另一种优雅的方式来做到这一点:

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

sugarjs: flatten

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