はじめに#
JavaScriptで複数のデータをまとめて扱うとき、最も頻繁に使用するのが「配列(Array)」です。配列を使いこなせるようになると、商品リスト、ユーザー一覧、フォームの入力値など、さまざまなデータを効率的に管理できます。
本記事では、以下の内容を初心者向けにわかりやすく解説します。
- 配列の作成方法と基本構文
- 要素の参照(アクセス)方法
- 要素の追加・更新・削除
- よく使う配列メソッド(push、pop、shift、unshift、splice、slice など)
- 配列の検索と確認
- 実践的な活用例
配列とは#
配列とは、複数の値を順番に並べて1つの変数で管理できるデータ構造です。配列内の各値を「要素」と呼び、それぞれの要素には0から始まる番号(インデックス)が割り振られます。
1
2
3
|
// 配列のイメージ
// インデックス: 0 1 2
const fruits = ["りんご", "みかん", "ぶどう"];
|
配列を使うことで、関連するデータをまとめて管理し、ループ処理で一括操作するなど、効率的なプログラムを書けます。
配列の作成方法#
JavaScriptで配列を作成する方法は主に2つあります。
配列リテラルで作成する(推奨)#
最も一般的で推奨される方法です。角括弧[]の中に要素をカンマ区切りで記述します。
1
2
3
4
5
6
7
8
9
|
// 空の配列を作成
const emptyArray = [];
// 要素を持つ配列を作成
const numbers = [1, 2, 3, 4, 5];
const colors = ["赤", "青", "緑"];
// 異なる型の要素を混在させることも可能
const mixed = [1, "文字列", true, null, { name: "太郎" }];
|
Arrayコンストラクタで作成する#
new Array()を使って配列を作成することもできますが、挙動がわかりにくいため通常は配列リテラルを使用します。
1
2
3
4
5
6
7
8
9
10
|
// 空の配列を作成
const arr1 = new Array();
// 要素を持つ配列を作成
const arr2 = new Array("a", "b", "c");
// 注意: 引数が1つの数値の場合、その長さの空配列が作成される
const arr3 = new Array(3);
console.log(arr3); // [empty × 3]
console.log(arr3.length); // 3
|
new Array(3)は「3つの空スロットを持つ配列」を作成するため、初心者には混乱の原因になります。配列リテラルを使えばこのような問題を避けられます。
Array.of()で作成する#
Array.of()メソッドを使うと、引数をすべて要素として持つ配列を作成できます。
1
2
3
4
5
6
|
const arr = Array.of(1, 2, 3);
console.log(arr); // [1, 2, 3]
// 数値1つでも要素として扱われる
const single = Array.of(5);
console.log(single); // [5]
|
要素の参照(アクセス)#
配列の要素にアクセスするには、インデックス(添字)を使用します。インデックスは0から始まる点に注意してください。
インデックスで参照する#
1
2
3
4
5
6
7
8
9
|
const fruits = ["りんご", "みかん", "ぶどう"];
// 各要素にアクセス
console.log(fruits[0]); // "りんご"
console.log(fruits[1]); // "みかん"
console.log(fruits[2]); // "ぶどう"
// 存在しないインデックスはundefined
console.log(fruits[10]); // undefined
|
lengthプロパティ#
lengthプロパティで配列の要素数を取得できます。
1
2
|
const fruits = ["りんご", "みかん", "ぶどう"];
console.log(fruits.length); // 3
|
最後の要素にアクセスする#
配列の最後の要素にアクセスするには、length - 1をインデックスとして使用します。
1
2
3
4
|
const fruits = ["りんご", "みかん", "ぶどう"];
// 従来の方法
console.log(fruits[fruits.length - 1]); // "ぶどう"
|
ES2022以降ではat()メソッドを使って、負のインデックスで末尾からアクセスできます。
1
2
3
4
5
|
const fruits = ["りんご", "みかん", "ぶどう"];
// at()メソッドで末尾からアクセス
console.log(fruits.at(-1)); // "ぶどう"
console.log(fruits.at(-2)); // "みかん"
|
要素の更新#
配列の要素を更新するには、インデックスを指定して新しい値を代入します。
1
2
3
4
5
6
7
8
9
|
const fruits = ["りんご", "みかん", "ぶどう"];
// 2番目の要素を更新
fruits[1] = "オレンジ";
console.log(fruits); // ["りんご", "オレンジ", "ぶどう"]
// 最後の要素を更新
fruits[fruits.length - 1] = "メロン";
console.log(fruits); // ["りんご", "オレンジ", "メロン"]
|
constで宣言した配列でも、配列自体の参照は変わらないため、要素の更新は可能です。
1
2
3
4
5
|
const numbers = [1, 2, 3];
numbers[0] = 100; // OK: 要素の更新は可能
console.log(numbers); // [100, 2, 3]
// numbers = [4, 5, 6]; // エラー: 配列自体の再代入は不可
|
要素の追加#
配列に要素を追加する方法はいくつかあります。用途に応じて使い分けましょう。
push() - 末尾に追加#
push()メソッドは、配列の末尾に1つ以上の要素を追加します。戻り値は新しい配列の長さです。
1
2
3
4
5
6
7
8
9
|
const fruits = ["りんご", "みかん"];
// 末尾に1つ追加
fruits.push("ぶどう");
console.log(fruits); // ["りんご", "みかん", "ぶどう"]
// 複数の要素を一度に追加
fruits.push("メロン", "いちご");
console.log(fruits); // ["りんご", "みかん", "ぶどう", "メロン", "いちご"]
|
unshift() - 先頭に追加#
unshift()メソッドは、配列の先頭に1つ以上の要素を追加します。
1
2
3
4
5
6
7
8
9
|
const fruits = ["みかん", "ぶどう"];
// 先頭に1つ追加
fruits.unshift("りんご");
console.log(fruits); // ["りんご", "みかん", "ぶどう"]
// 複数の要素を一度に追加
fruits.unshift("メロン", "いちご");
console.log(fruits); // ["メロン", "いちご", "りんご", "みかん", "ぶどう"]
|
splice() - 任意の位置に追加#
splice()メソッドを使うと、配列の任意の位置に要素を追加できます。
1
2
3
4
5
6
7
8
9
|
const fruits = ["りんご", "ぶどう"];
// インデックス1の位置に"みかん"を挿入(削除数は0)
fruits.splice(1, 0, "みかん");
console.log(fruits); // ["りんご", "みかん", "ぶどう"]
// 複数の要素を挿入
fruits.splice(2, 0, "メロン", "いちご");
console.log(fruits); // ["りんご", "みかん", "メロン", "いちご", "ぶどう"]
|
要素の削除#
配列から要素を削除する方法も複数あります。
pop() - 末尾から削除#
pop()メソッドは、配列の末尾から要素を1つ削除し、削除した要素を返します。
1
2
3
4
5
|
const fruits = ["りんご", "みかん", "ぶどう"];
const removed = fruits.pop();
console.log(removed); // "ぶどう"
console.log(fruits); // ["りんご", "みかん"]
|
shift() - 先頭から削除#
shift()メソッドは、配列の先頭から要素を1つ削除し、削除した要素を返します。
1
2
3
4
5
|
const fruits = ["りんご", "みかん", "ぶどう"];
const removed = fruits.shift();
console.log(removed); // "りんご"
console.log(fruits); // ["みかん", "ぶどう"]
|
splice() - 任意の位置から削除#
splice()メソッドを使うと、配列の任意の位置から指定した数の要素を削除できます。
1
2
3
4
5
6
|
const fruits = ["りんご", "みかん", "ぶどう", "メロン"];
// インデックス1から2つの要素を削除
const removed = fruits.splice(1, 2);
console.log(removed); // ["みかん", "ぶどう"]
console.log(fruits); // ["りんご", "メロン"]
|
delete演算子(非推奨)#
delete演算子でも要素を削除できますが、配列に「穴」が空くため推奨されません。
1
2
3
4
5
|
const fruits = ["りんご", "みかん", "ぶどう"];
delete fruits[1];
console.log(fruits); // ["りんご", empty, "ぶどう"]
console.log(fruits.length); // 3(長さは変わらない)
|
配列の要素を削除する場合はsplice()を使用しましょう。
配列の一部を取り出す - slice()#
slice()メソッドは、配列の一部を切り出して新しい配列を作成します。元の配列は変更されません。
1
2
3
4
5
6
7
8
9
10
11
12
|
const fruits = ["りんご", "みかん", "ぶどう", "メロン", "いちご"];
// インデックス1から3の手前まで取り出す
const sliced = fruits.slice(1, 3);
console.log(sliced); // ["みかん", "ぶどう"]
console.log(fruits); // ["りんご", "みかん", "ぶどう", "メロン", "いちご"](変更なし)
// インデックス2から末尾まで取り出す
console.log(fruits.slice(2)); // ["ぶどう", "メロン", "いちご"]
// 負のインデックスで末尾から指定
console.log(fruits.slice(-2)); // ["メロン", "いちご"]
|
splice()とslice()の違い#
この2つのメソッドは名前が似ていますが、動作が大きく異なります。
| メソッド |
元の配列 |
戻り値 |
用途 |
| splice() |
変更される |
削除した要素 |
要素の追加・削除 |
| slice() |
変更されない |
切り出した新しい配列 |
配列の一部をコピー |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
const original = [1, 2, 3, 4, 5];
// splice: 元の配列を変更
const spliced = original.splice(1, 2);
console.log(spliced); // [2, 3]
console.log(original); // [1, 4, 5](変更された)
const original2 = [1, 2, 3, 4, 5];
// slice: 元の配列は変更しない
const sliced2 = original2.slice(1, 3);
console.log(sliced2); // [2, 3]
console.log(original2); // [1, 2, 3, 4, 5](変更なし)
|
配列の検索#
配列内の要素を検索するためのメソッドを紹介します。
indexOf() - インデックスを取得#
指定した要素が最初に見つかったインデックスを返します。見つからない場合は-1を返します。
1
2
3
4
|
const fruits = ["りんご", "みかん", "ぶどう", "みかん"];
console.log(fruits.indexOf("みかん")); // 1
console.log(fruits.indexOf("メロン")); // -1
|
includes() - 存在確認#
指定した要素が配列に含まれているかをtrueまたはfalseで返します。
1
2
3
4
|
const fruits = ["りんご", "みかん", "ぶどう"];
console.log(fruits.includes("みかん")); // true
console.log(fruits.includes("メロン")); // false
|
find() - 条件に合う要素を取得#
条件を満たす最初の要素を返します。見つからない場合はundefinedを返します。
1
2
3
4
5
6
7
8
9
10
11
|
const users = [
{ id: 1, name: "太郎" },
{ id: 2, name: "花子" },
{ id: 3, name: "次郎" }
];
const user = users.find(u => u.id === 2);
console.log(user); // { id: 2, name: "花子" }
const notFound = users.find(u => u.id === 10);
console.log(notFound); // undefined
|
findIndex() - 条件に合う要素のインデックスを取得#
条件を満たす最初の要素のインデックスを返します。見つからない場合は-1を返します。
1
2
3
4
5
6
7
8
|
const users = [
{ id: 1, name: "太郎" },
{ id: 2, name: "花子" },
{ id: 3, name: "次郎" }
];
const index = users.findIndex(u => u.name === "花子");
console.log(index); // 1
|
配列の結合と分割#
concat() - 配列を結合#
2つ以上の配列を結合して新しい配列を作成します。元の配列は変更されません。
1
2
3
4
5
6
7
|
const arr1 = [1, 2];
const arr2 = [3, 4];
const arr3 = [5, 6];
const combined = arr1.concat(arr2, arr3);
console.log(combined); // [1, 2, 3, 4, 5, 6]
console.log(arr1); // [1, 2](変更なし)
|
スプレッド構文を使う方法もあります。
1
2
3
4
5
|
const arr1 = [1, 2];
const arr2 = [3, 4];
const combined = [...arr1, ...arr2];
console.log(combined); // [1, 2, 3, 4]
|
join() - 配列を文字列に変換#
配列の要素を指定した区切り文字で連結し、1つの文字列にします。
1
2
3
4
5
|
const fruits = ["りんご", "みかん", "ぶどう"];
console.log(fruits.join()); // "りんご,みかん,ぶどう"
console.log(fruits.join(" / ")); // "りんご / みかん / ぶどう"
console.log(fruits.join("")); // "りんごみかんぶどう"
|
配列のコピー#
配列をコピーする際は、参照のコピーではなく値のコピー(シャローコピー)を行う必要があります。
参照の問題#
単純な代入では配列の参照がコピーされるため、一方を変更するともう一方も変わります。
1
2
3
4
5
6
|
const original = [1, 2, 3];
const reference = original; // 参照のコピー
reference.push(4);
console.log(original); // [1, 2, 3, 4](変更されてしまう)
console.log(reference); // [1, 2, 3, 4]
|
正しいコピー方法#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
const original = [1, 2, 3];
// 方法1: スプレッド構文(推奨)
const copy1 = [...original];
// 方法2: slice()
const copy2 = original.slice();
// 方法3: Array.from()
const copy3 = Array.from(original);
copy1.push(4);
console.log(original); // [1, 2, 3](変更されない)
console.log(copy1); // [1, 2, 3, 4]
|
よく使うメソッドの一覧#
配列操作で頻繁に使用するメソッドを一覧にまとめます。
破壊的メソッド(元の配列を変更する)#
| メソッド |
説明 |
| push() |
末尾に要素を追加 |
| pop() |
末尾の要素を削除 |
| unshift() |
先頭に要素を追加 |
| shift() |
先頭の要素を削除 |
| splice() |
任意の位置で追加・削除 |
| sort() |
要素を並べ替え |
| reverse() |
要素の順序を反転 |
非破壊的メソッド(元の配列を変更しない)#
| メソッド |
説明 |
| slice() |
配列の一部を切り出す |
| concat() |
配列を結合 |
| join() |
配列を文字列に変換 |
| indexOf() |
要素のインデックスを取得 |
| includes() |
要素の存在を確認 |
| find() |
条件に合う要素を取得 |
| findIndex() |
条件に合う要素のインデックスを取得 |
実践例: ToDoリストの操作#
学んだ内容を活用して、簡単なToDoリストを操作する例を見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
// ToDoリストを初期化
const todos = [
{ id: 1, task: "買い物に行く", done: false },
{ id: 2, task: "レポートを書く", done: true },
{ id: 3, task: "運動をする", done: false }
];
// 新しいタスクを追加
function addTodo(task) {
const newId = todos.length > 0
? Math.max(...todos.map(t => t.id)) + 1
: 1;
todos.push({ id: newId, task: task, done: false });
}
// タスクを完了にする
function completeTodo(id) {
const todo = todos.find(t => t.id === id);
if (todo) {
todo.done = true;
}
}
// タスクを削除する
function deleteTodo(id) {
const index = todos.findIndex(t => t.id === id);
if (index !== -1) {
todos.splice(index, 1);
}
}
// 未完了のタスクを取得
function getIncompleteTodos() {
return todos.filter(t => !t.done);
}
// 使用例
addTodo("本を読む");
console.log(todos);
// [
// { id: 1, task: "買い物に行く", done: false },
// { id: 2, task: "レポートを書く", done: true },
// { id: 3, task: "運動をする", done: false },
// { id: 4, task: "本を読む", done: false }
// ]
completeTodo(1);
console.log(todos[0].done); // true
deleteTodo(2);
console.log(todos.length); // 3
console.log(getIncompleteTodos());
// [
// { id: 3, task: "運動をする", done: false },
// { id: 4, task: "本を読む", done: false }
// ]
|
まとめ#
本記事では、JavaScriptの配列の基本操作について解説しました。重要なポイントを振り返ります。
- 配列の作成: 配列リテラル
[]を使うのが最も一般的
- 要素の参照: インデックス(0始まり)で要素にアクセス
- 要素の追加:
push()で末尾、unshift()で先頭、splice()で任意の位置に追加
- 要素の削除:
pop()で末尾、shift()で先頭、splice()で任意の位置から削除
- 配列の一部を取り出す:
slice()を使用(元の配列は変更されない)
- 検索:
indexOf()、includes()、find()、findIndex()を用途に応じて使い分け
- 結合:
concat()やスプレッド構文で配列を結合
配列操作のメソッドには、元の配列を変更する「破壊的メソッド」と変更しない「非破壊的メソッド」があります。どちらに該当するかを意識しながら使用することで、意図しないバグを防げます。
次のステップとして、map()、filter()、reduce()といった高階関数を使った配列操作を学ぶと、より宣言的で読みやすいコードが書けるようになります。
参考リンク#