JavaScript の配列(Array)は、複数の値をまとめて管理するための基本的なデータ構造です。要素の追加・削除、ループ処理、検索・フィルタリング、ソートなど、あらゆる場面で使います。この記事では配列の作成から主要メソッドの全体像までを体系的にまとめます。
この記事でわかること
・配列の作成方法(リテラル・Array.from・Array.of)
・要素へのアクセスと at() メソッド
・要素の追加(push / unshift / splice)と削除(pop / shift / splice)
・ループ処理(for / forEach / for…of / map)
・スプレッド構文によるコピー・結合・展開
・分割代入で要素を変数に取り出す方法
・破壊的メソッドと非破壊的メソッドの分類
・配列メソッド早見表
・配列の作成方法(リテラル・Array.from・Array.of)
・要素へのアクセスと at() メソッド
・要素の追加(push / unshift / splice)と削除(pop / shift / splice)
・ループ処理(for / forEach / for…of / map)
・スプレッド構文によるコピー・結合・展開
・分割代入で要素を変数に取り出す方法
・破壊的メソッドと非破壊的メソッドの分類
・配列メソッド早見表
配列の作成方法
配列リテラル(最も一般的)
const fruits = ["りんご", "みかん", "ぶどう"]; const numbers = [1, 2, 3, 4, 5]; const mixed = [1, "hello", true, null]; // 異なる型も格納可能 const empty = []; // 空の配列
Array.from(配列風オブジェクトから変換)
// NodeList → 配列
const divs = Array.from(document.querySelectorAll("div"));
// 文字列 → 1文字ずつの配列
const chars = Array.from("Hello"); // ["H", "e", "l", "l", "o"]
// 連番の配列を生成
const range = Array.from({ length: 5 }, (_, i) => i + 1);
// [1, 2, 3, 4, 5]
Array.of(引数をそのまま要素に)
// new Array(5) は「長さ5の空配列」を作ってしまう console.log(new Array(5)); // [空×5] // Array.of(5) は「要素が5の配列」を作る console.log(Array.of(5)); // [5] console.log(Array.of(1, 2, 3)); // [1, 2, 3]
要素へのアクセス
JavaScript
const arr = [10, 20, 30, 40, 50]; // ブラケット記法(0始まり) console.log(arr[0]); // 10(先頭) console.log(arr[4]); // 50(末尾) console.log(arr[10]); // undefined(範囲外) // at() メソッド(負のインデックス対応・ES2022) console.log(arr.at(0)); // 10 console.log(arr.at(-1)); // 50(末尾) console.log(arr.at(-2)); // 40(末尾から2番目)
末尾の要素を取得するなら
arr.at(-1) が arr[arr.length - 1] よりも簡潔です。要素の追加と削除
| メソッド | 位置 | 動作 | 戻り値 |
|---|---|---|---|
push(el) |
末尾 | 追加 | 新しい length |
pop() |
末尾 | 削除 | 削除した要素 |
unshift(el) |
先頭 | 追加 | 新しい length |
shift() |
先頭 | 削除 | 削除した要素 |
splice(i, n, ...el) |
任意 | 削除+追加 | 削除した要素の配列 |
JavaScript
const arr = [1, 2, 3]; arr.push(4); // [1, 2, 3, 4](末尾に追加) arr.pop(); // [1, 2, 3](末尾を削除) arr.unshift(0); // [0, 1, 2, 3](先頭に追加) arr.shift(); // [1, 2, 3](先頭を削除) // splice: インデックス1から1個削除し、10を挿入 arr.splice(1, 1, 10); // [1, 10, 3]
これらのメソッドはすべて破壊的(元の配列を変更)です。React の state 更新など元の配列を変更したくない場合は、スプレッド構文や非破壊メソッド(後述)を使ってください。
配列のループ処理
| 方法 | 特徴 | 推奨場面 |
|---|---|---|
for ループ |
インデックスを使える、break / continue 可能 | インデックスが必要、途中終了したい場合 |
for...of |
値を直接取得、break 可能 | 値だけ必要、途中終了したい場合 |
forEach |
コールバック形式、break 不可 | 全要素を処理する場合 |
map |
新しい配列を返す | 変換して新しい配列を作る場合 |
JavaScript
const fruits = ["りんご", "みかん", "ぶどう"];
// for ループ
for (let i = 0; i < fruits.length; i++) {
console.log(i, fruits[i]);
}
// for...of(値だけ取得)
for (const fruit of fruits) {
console.log(fruit);
}
// forEach(コールバック)
fruits.forEach((fruit, index) => {
console.log(index, fruit);
});
// map(新しい配列を生成)
const upper = fruits.map(f => f + "ジュース");
console.log(upper); // ["りんごジュース", "みかんジュース", "ぶどうジュース"]
スプレッド構文(…)でコピー・結合・展開
配列のコピー
const original = [1, 2, 3]; const copy = [...original]; copy.push(4); console.log(original); // [1, 2, 3](元は変わらない) console.log(copy); // [1, 2, 3, 4]
配列の結合
const a = [1, 2]; const b = [3, 4]; const merged = [...a, ...b]; // [1, 2, 3, 4] // 途中に要素を挟むことも可能 const withMiddle = [...a, 99, ...b]; // [1, 2, 99, 3, 4]
関数の引数に展開
const scores = [85, 92, 78, 96, 88]; console.log(Math.max(...scores)); // 96 console.log(Math.min(...scores)); // 78
スプレッド構文はシャローコピーです。配列の要素がオブジェクトの場合、オブジェクト自体は参照を共有します。ディープコピーには
structuredClone(arr) を使います。分割代入で要素を変数に取り出す
JavaScript
const rgb = [255, 128, 0]; // 各要素を変数に取り出す const [red, green, blue] = rgb; console.log(red, green, blue); // 255, 128, 0 // 一部をスキップ const [first, , third] = [10, 20, 30]; console.log(first, third); // 10, 30 // 残りをまとめて取得(レスト構文) const [head, ...rest] = [1, 2, 3, 4, 5]; console.log(head); // 1 console.log(rest); // [2, 3, 4, 5] // デフォルト値 const [a = 0, b = 0, c = 0] = [10]; console.log(a, b, c); // 10, 0, 0
変数の入れ替え(swap)
let x = 1; let y = 2; [x, y] = [y, x]; console.log(x, y); // 2, 1
破壊的メソッドと非破壊的メソッドの分類
JavaScript の配列メソッドには、元の配列を変更するもの(破壊的)と新しい配列を返すもの(非破壊的)があります。React やイミュータブルな設計では非破壊的メソッドが推奨されます。
| 破壊的(元を変更する) | 非破壊的(新しい配列を返す) |
|---|---|
push / pop / shift / unshift |
concat / slice |
splice |
toSpliced(ES2023) |
sort |
toSorted(ES2023) |
reverse |
toReversed(ES2023) |
fill |
with(ES2023) |
ES2023 の非破壊メソッド
const arr = [3, 1, 2]; // toSorted: 元の配列を変更せずにソート const sorted = arr.toSorted((a, b) => a - b); console.log(sorted); // [1, 2, 3] console.log(arr); // [3, 1, 2](元のまま) // toReversed: 元の配列を変更せずに反転 const reversed = arr.toReversed(); console.log(reversed); // [2, 1, 3] // with: 指定インデックスの値を変更した新しい配列 const updated = arr.with(1, 99); console.log(updated); // [3, 99, 2]
ES2023 の
toSorted / toReversed / toSpliced / with は元の配列を変更しないため、React の state 更新に最適です。sort の注意点
数値ソートの落とし穴
const nums = [10, 2, 30, 4]; // NG: デフォルトは文字列比較 console.log(nums.sort()); // [10, 2, 30, 4](文字列として比較) // OK: 比較関数を渡す console.log(nums.sort((a, b) => a - b)); // [2, 4, 10, 30](昇順) console.log(nums.sort((a, b) => b - a)); // [30, 10, 4, 2](降順)
sort() のデフォルトは文字列として比較するため、数値のソートでは必ず比較関数 (a, b) => a - b を渡してください。配列メソッド早見表
| カテゴリ | メソッド | 概要 |
|---|---|---|
| 追加・削除 | push / pop / shift / unshift / splice |
要素の追加・削除 |
| 検索 | indexOf / includes / find / findIndex / findLast |
要素の存在・位置・値を検索 |
| 変換 | map / flatMap |
各要素を変換して新しい配列を返す |
| フィルタ | filter |
条件に合う要素だけの配列を返す |
| 集計 | reduce / reduceRight |
全要素を1つの値にまとめる |
| 判定 | every / some |
全要素 or いずれかが条件を満たすか |
| 順序 | sort / reverse / toSorted / toReversed |
並び替え・反転 |
| 切り出し | slice / splice / toSpliced |
一部を切り出す・削除 |
| 結合 | concat / flat / join |
配列の結合・平坦化・文字列化 |
| 生成 | Array.from / Array.of / fill / keys / values / entries |
配列の生成・イテレータ |
関連記事
- 配列の map・filter・reduce の使い方
- slice の使い方 — 配列・文字列の切り出し
- 配列から要素を削除する方法
- 配列に要素を追加する方法
- 配列の重複を削除する方法 — Set・filter
- includes の使い方 — 配列・文字列の存在チェック
よくある質問
Q配列のコピーはどう行いますか?
Aスプレッド構文
[...arr] でシャローコピーできます。要素にオブジェクトが含まれる場合はオブジェクト自体は共有されるため、ディープコピーが必要なら structuredClone(arr) を使ってください。Qsort() で数値が正しくソートされません。
A
sort() のデフォルトは文字列として比較するため、[10, 2, 30].sort() は [10, 2, 30] になります。数値のソートには比較関数 .sort((a, b) => a - b) を必ず渡してください。Q破壊的メソッドと非破壊的メソッドの見分け方は?
A残念ながら名前だけでは判断できません。ES2023 で追加された
toSorted / toReversed / toSpliced / with は非破壊版として設計されています。判断に迷ったら MDN のドキュメントで「元の配列を変更する」かどうかを確認してください。QforEach と map の違いは何ですか?
A
forEach は戻り値がなく(undefined)、副作用(console.log など)のために使います。map は各要素を変換した新しい配列を返すため、変換処理に使います。Q配列かどうかを判定するには?
A
Array.isArray(value) を使います。typeof では配列は "object" と判定されるため区別できません。まとめ
JavaScript の配列の使い方を体系的に整理しました。
- 作成: 配列リテラル
[]が基本、Array.from で変換、Array.of で要素指定 - アクセス:
arr[i]、末尾はarr.at(-1) - 追加・削除: push / pop / unshift / shift / splice
- ループ: for…of(値だけ)/ forEach(コールバック)/ map(変換)
- スプレッド構文: コピー・結合・関数引数への展開
- 分割代入: 要素を変数に取り出す、レスト構文、swap
- 破壊的 vs 非破壊: ES2023 の toSorted / toReversed / with が非破壊版
配列は JavaScript の中核となるデータ構造です。メソッド早見表を手元に置いて、map / filter / reduce などの詳細は関連記事で掘り下げてください。