入れ子の配列を平らにする

入れ子になった配列を1段階だけ、または全部平らにする方法をまとめます。flat() の深さ指定、 flatMap() で変換と平坦化を同時にやる書き方、穴が消える挙動まで実行して確かめます。

実行して検証済み処理系Node 22.22.3対応ES2019難易度●●○○○目安7更新

答え

flat() を使います。引数を省くと1段だけ平らになります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 1, 2, 3, 4, [ 5 ] ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 1, 2, 3, 4 ]

深さが分からないなら Infinity を渡します。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 1, 2, [ 3, [ 4 ] ] ] [ 1, 2, 3, [ 4 ] ] [ 1, 2, 3, 4 ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ [ 'a', 'b' ], [ 'c', 'd' ] ] [ 'a', 'b', 'c', 'd' ]

何段まで平らにするか

引数は何段まで潰すかです。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 1, 2, 2, 4, 3, 6 ] [ 1, 3 ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 1, <1 empty item>, 2, [ 3, <1 empty item>, 4 ] ] [ 1, 2, 3, 4 ]

深さが分かっているなら数を書いてください。 Infinity は分かりやすい反面、「本当は2段のはず」という前提が消えます。 意図しない深さのデータが混ざっても、黙って平らになってしまいます。

変換しながら平らにする

map() の結果が配列になるときは、flatMap() が使えます。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 1, [ 2 ] ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
2 2

flatMap()map() してから flat() するのと同じです。 ただし平らにするのは1段だけで、深さは指定できません。

増やすことも減らすこともできる

返す配列の長さを変えれば、要素を増減できます

javascript
const nested = [1, [2, 3]];

nested.flat();

console.log(nested);
[ 1, [ 2, 3 ] ]
javascript
const rows = [{ tags: ['a', 'b'] }, { tags: ['c'] }];

console.log(rows.flat());
[ { tags: [ 'a', 'b' ] }, { tags: [ 'c' ] } ]

空の配列を返すと、その要素は消えますfilter()map() を一度に書けるので、条件付きの変換で便利です。

読みやすさは場合によります。「絞る」と「変える」を分けたほうが分かりやすいなら、filter()map() を繋げてください。配列を変換する・絞り込む

知っておくこと:穴が消える

flat() は、配列の黙って取り除きます

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'a', 'b', 'c' ]

平らにするだけのつもりが、長さが変わります。 穴のある配列を扱っているなら、要素数を当てにしないでください。

穴は undefined とは違います。[1, , 2] は「2番目が無い」という状態で、読み出すと undefined になるだけです。 → 配列の基本

深さに 0 を渡すと何もしない

変数から深さを渡すときに効いてきます。 flat(depth)depth0になる経路があると、 平らにならないまま先へ進みます。エラーは出ません。

深さが決まらないなら Infinity、決まるなら数を書く。 変数を渡すなら、0になり得ないか確かめてください。

長さがどう変わるか

外側の要素数と、平らにしたあとの要素数は一致するとは限りません。 中身が1つずつなら偶然そろいますが、数を当てにしないでください。

よくある間違い

元の配列が変わると思っている

flat()新しい配列を返すだけです。元は変わりません。 戻り値を受け取ってください。

オブジェクトの中の配列は平らにならない

flat() が見るのは配列の要素が配列かどうかだけです。 オブジェクトの中までは入りません。取り出してから平らにします。

これが flatMap() のいちばん多い使い道です。

まとめ

  • flat() は引数を省くと1段。深さは数で指定する
  • 深さが不明なら Infinity。ただし前提が消えることを承知で
  • flatMap() は変換と平坦化を同時に。平らにするのは1段だけ
  • 空の配列を返せば要素を消せる
  • 穴は黙って取り除かれる。 長さが変わる
  • どちらも元の配列を変えない

この記事の根拠

  1. Array.prototype.flat — ECMAScript® 2026 Language Specificationtc39.es
  2. Array.prototype.flatMap — ECMAScript® 2026 Language Specificationtc39.es

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)