JavaScript: 配列の配列をフラット化する徹底解説

2024-04-02

JavaScriptで配列の配列を結合(Flatten)する方法

問題

  • 複数のAPIから取得したデータを一つの配列にまとめたい
  • 表形式のデータを処理したい
  • 配列の配列を再帰的に処理したい

解決策

配列の配列を結合するには、いくつかの方法があります。以下に、代表的な方法を紹介します。

Array.prototype.reduce() メソッドは、配列の要素を順次処理し、単一の値に集約することができます。このメソッドを使って、配列の配列を結合することができます。

const arrayOfArrays = [[1, 2], [3, 4], [5, 6]];

const flattenedArray = arrayOfArrays.reduce((acc, cur) => {
  return acc.concat(cur);
}, []);

console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]

このコードでは、reduce() メソッドを使って、arrayOfArrays の各要素を acc に追加しています。acc は、最終的に結合された配列になります。

Array.prototype.flat()

JavaScript ES2019では、Array.prototype.flat() メソッドが追加されました。このメソッドは、配列の配列を再帰的にフラット化することができます。

const arrayOfArrays = [[1, 2], [3, 4], [5, 6]];

const flattenedArray = arrayOfArrays.flat();

console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]

このコードでは、flat() メソッドを使って、arrayOfArrays をフラット化しています。

上記以外にも、以下のような方法で配列の配列を結合することができます。

  • for ループを使って、各要素を結合する
  • Array.prototype.concat() メソッドを使って、各要素を結合する
  • Lodashなどのライブラリを使う

JavaScriptで配列の配列を結合するには、いくつかの方法があります。状況に合わせて、最適な方法を選択してください。

補足

  • flat() メソッドは、ES2019で追加された新しいメソッドです。古いブラウザでは使用できない場合があります。
  • flat() メソッドは、配列の配列を再帰的にフラット化します。ネストされた配列の深さに制限はありません。
  • flat() メソッドには、オプション引数として深さを指定することができます。



Array.prototype.reduce()

const arrayOfArrays = [[1, 2], [3, 4], [5, 6]];

const flattenedArray = arrayOfArrays.reduce((acc, cur) => {
  return acc.concat(cur);
}, []);

console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]

Array.prototype.flat()

const arrayOfArrays = [[1, 2], [3, 4], [5, 6]];

const flattenedArray = arrayOfArrays.flat();

console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]

for ループ

const arrayOfArrays = [[1, 2], [3, 4], [5, 6]];

const flattenedArray = [];

for (const array of arrayOfArrays) {
  for (const value of array) {
    flattenedArray.push(value);
  }
}

console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]

Array.prototype.concat()

const arrayOfArrays = [[1, 2], [3, 4], [5, 6]];

const flattenedArray = [].concat(...arrayOfArrays);

console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]

Lodash

const _ = require('lodash');

const arrayOfArrays = [[1, 2], [3, 4], [5, 6]];

const flattenedArray = _.flatten(arrayOfArrays);

console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]



配列の配列を結合するその他の方法

Array.prototype.spread() メソッドは、ES2018で追加された新しいメソッドです。このメソッドは、スプレッド構文を使って、配列の要素を個別に展開することができます。

const arrayOfArrays = [[1, 2], [3, 4], [5, 6]];

const flattenedArray = [...arrayOfArrays];

console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]
const arrayOfArrays = [[1, 2], [3, 4], [5, 6]];

const flattenedArray = arrayOfArrays.flatMap(array => array);

console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]

ジェネレータを使って、配列の配列を結合することができます。

function* flatten(arrays) {
  for (const array of arrays) {
    yield* array;
  }
}

const arrayOfArrays = [[1, 2], [3, 4], [5, 6]];

const flattenedArray = [...flatten(arrayOfArrays)];

console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]

リカージョン

function flatten(arrays) {
  if (!arrays.length) {
    return [];
  }

  const head = arrays[0];
  const tail = arrays.slice(1);

  return [...head, ...flatten(tail)];
}

const arrayOfArrays = [[1, 2], [3, 4], [5, 6]];

const flattenedArray = flatten(arrayOfArrays);

console.log(flattenedArray); // [1, 2, 3, 4, 5, 6]

javascript arrays multidimensional-array


JavaScript: classList、className、正規表現を使った要素のクラス判定

ここでは、JavaScriptで要素にクラスが含まれているかどうかを確認する3つの方法を紹介します。最もシンプルで効率的な方法は、classList プロパティを使用する方法です。classList プロパティは、要素のクラス名のリストを表すオブジェクトです。...


TypeScriptで数値を文字列に変換:toString、String、テンプレートリテラルなど7つの方法

最も簡単な方法は、toString() メソッドを使うことです。toString() メソッドは、数値を10進文字列に変換します。String() コンストラクタを使って、数値を文字列に変換することもできます。テンプレートリテラルを使って、数値を文字列に埋め込むこともできます。...


React vs Angular: データバインディング徹底比較!一方通行と双方向のメリット・デメリットをわかりやすく解説

Reactは一方通行データバインディングを採用しており、データの流れはモデル(Model)からビュー(View)へと一方方向に進みます。一方、Angularは双方向データバインディングを採用しており、モデルとビューの間で双方向にデータの流れが発生します。...


Lodash を使いこなして Angular 2 + TypeScript アプリをパワーアップ

まず、Lodash と TypeScript の型定義ファイルをインストールします。次に、アプリケーションで Lodash を使用したいファイルに Lodash をインポートします。すべての Lodash 関数をインポートする場合Lodash の関数は、インポートした名前を使って呼び出すことができます。...