24

[[1,2,3],[4,5,6],[7,8,9]] ==> [1 、2,3,4,5,6,7,8,9]。

ご想像のとおり、これが必要なのは、"for in" コンストラクト内の関数から配列を生成しており、結果のネストされた配列を連結する必要があるためです。

結果 = (arr の x に対して generate_array(x))

これを処理するエレガントな方法はありますか?ご指摘ありがとうございます。

4

5 に答える 5

49

JSイディオムを使用するだけです:

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

これは、Coffee で少し良くなります。

$ 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

コーヒーにこれはどうですか

[[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 に答える
5

OK、1 つの方法は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 実装は同じことを行います。

于 2011-01-08T00:37:28.710 に答える
0

sugarjsはそれを行うもう1つの優雅な方法です:

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

sugarjs:平らにする

于 2012-07-06T15:08:54.313 に答える
-3

ロダッシュを使ってみませんか?

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

https://lodash.com/docs#flatten

于 2015-06-26T09:39:36.667 に答える