---
type: how-to
language: javascript
slug: array/flatten
title: "入れ子の配列を平らにする"
title_tag: "JavaScript 配列を平坦化する — flat と flatMap の使い方"
summary: >
  入れ子になった配列を1段階だけ、または全部平らにする方法をまとめます。flat() の深さ指定、
  flatMap() で変換と平坦化を同時にやる書き方、穴が消える挙動まで実行して確かめます。
description: >
  flat() は引数を省くと1段だけ平らにします。深さの指定、flatMap で変換と同時にやる書き方、穴が黙って取り除かれて長さが変わる挙動まで、実行して確かめられます。
status: published
difficulty: 2
minutes: 7

versions:
  verified: "Node 22.22.3"
  since: "ES2019"
  deprecated: null
  removed: null

sources:
  - title: "Array.prototype.flat — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-array.prototype.flat"
  - title: "Array.prototype.flatMap — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-array.prototype.flatmap"

terms: [平坦化, 深さ, 穴]

links:
  related:
    - javascript/reference/array/map
    - javascript/learn/array/transform
    - javascript/how-to/array/remove-duplicates

content_updated_at: 2026-09-08
published_at: 2026-09-08
---

## 答え

`flat()` を使います。**引数を省くと[num:1]段だけ平らになります。**

```js run
const nested = [1, [2, 3], [4, [5]]];

console.log(nested.flat());
```
```output
[ 1, 2, 3, 4, [ 5 ] ]
```

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

```js run
const deep = [1, [2, [3, [4]]]];

console.log(deep.flat(Infinity));
```
```output
[ 1, 2, 3, 4 ]
```

## 何段まで平らにするか

引数は[key:何段まで潰すか]です。

```js run
const deep = [1, [2, [3, [4]]]];

console.log(deep.flat());
console.log(deep.flat(2));
console.log(deep.flat(Infinity));
```
```output
[ 1, 2, [ 3, [ 4 ] ] ]
[ 1, 2, 3, [ 4 ] ]
[ 1, 2, 3, 4 ]
```

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

## 変換しながら平らにする

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

```js run
const lines = ['a b', 'c d'];

console.log(lines.map((line) => line.split(' ')));
console.log(lines.flatMap((line) => line.split(' ')));
```
```output
[ [ 'a', 'b' ], [ 'c', 'd' ] ]
[ 'a', 'b', 'c', 'd' ]
```

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

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

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

```js run
const nums = [1, 2, 3];

console.log(nums.flatMap((n) => [n, n * 2]));
console.log(nums.flatMap((n) => (n % 2 ? [n] : [])));
```
```output
[ 1, 2, 2, 4, 3, 6 ]
[ 1, 3 ]
```

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

[dim:読みやすさは場合によります。「絞る」と「変える」を分けたほうが分かりやすいなら、`filter()` と `map()` を繋げてください。]
→ [配列を変換する・絞り込む](/ja/javascript/learn/array/transform/)

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

`flat()` は、配列の[type:穴]を[bad:黙って取り除きます]。

```js run
const holes = [1, , 2, [3, , 4]];

console.log(holes);
console.log(holes.flat());
```
```output
[ 1, <1 empty item>, 2, [ 3, <1 empty item>, 4 ] ]
[ 1, 2, 3, 4 ]
```

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

穴は `undefined` とは違います。`[1, , 2]` は「2番目が無い」という状態で、[dim:読み出すと `undefined` になるだけです]。
→ [配列の基本](/ja/javascript/learn/array/basics/)

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

```js run
console.log([1, [2]].flat(0));
```
```output
[ 1, [ 2 ] ]
```

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

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

## 長さがどう変わるか

```js run
console.log([[1], [2]].length);
console.log([[1], [2]].flat().length);
```
```output
2
2
```

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

## よくある間違い

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

```js bad
const nested = [1, [2, 3]];

nested.flat();

console.log(nested);
```
```output
[ 1, [ 2, 3 ] ]
```

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

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

```js bad
const rows = [{ tags: ['a', 'b'] }, { tags: ['c'] }];

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

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

```js run
const rows = [{ tags: ['a', 'b'] }, { tags: ['c'] }];

console.log(rows.flatMap((row) => row.tags));
```
```output
[ 'a', 'b', 'c' ]
```

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

## まとめ

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