2011-01-08 98 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));