MENU

【JavaScript】配列 (Array) の操作を解説|Webの基礎

JavaScriptでの配列操作の解説|Webの基礎
目次

はじめに

前回の記事では、演算子(算術演算子・比較演算子・論理演算子・三項演算子)の使い方を解説しました。

今回は、複数のデータをまとめて扱うときに欠かせない配列(Array)の操作方法を解説します。要素の追加・削除から検索、変換・集計、並び替えまで、実務でよく使う書き方を中心に紹介します。

配列の基本(作成・要素の取得・length)

配列は[](角括弧)で複数の値をまとめて管理できるデータ構造です。

const fruits = ["りんご", "みかん", "ぶどう"];

console.log(fruits[0]); // "りんご"(先頭の要素。添字は0から始まる)
console.log(fruits[2]); // "ぶどう"(末尾の要素)
console.log(fruits.length); // 3(要素の数)

VBAの配列(Dim arr(2) As String)も添字は0始まりなので考え方は同じです。ただしVBAはReDimをしないと要素数を変えられないのに対し、JavaScriptの配列は次で紹介するpushなどのメソッドで要素数を自由に増減できます。

要素の追加・削除(push・pop・unshift・shift)

配列の先頭・末尾に要素を追加したり取り除いたりする基本の書き方です。

const cart = ["ノートPC", "マウス"];

cart.push("キーボード"); // 末尾に追加
console.log(cart); // ["ノートPC", "マウス", "キーボード"]

cart.pop(); // 末尾の要素を削除して返す
console.log(cart); // ["ノートPC", "マウス"]

cart.unshift("USBメモリ"); // 先頭に追加
console.log(cart); // ["USBメモリ", "ノートPC", "マウス"]

cart.shift(); // 先頭の要素を削除して返す
console.log(cart); // ["ノートPC", "マウス"]

先頭や末尾ではなく、途中の位置に追加・削除したい場合はspliceを使います。

const cart = ["ノートPC", "マウス"];

cart.splice(1, 0, "モニター"); // 1番目の位置に0個削除して挿入
console.log(cart); // ["ノートPC", "モニター", "マウス"]

cart.splice(1, 1); // 1番目から1個削除
console.log(cart); // ["ノートPC", "マウス"]

splice(開始位置, 削除する数, 追加する要素...)という書き方で、削除だけ・追加だけ・両方同時に、といった操作がまとめてできます。

要素の検索(includes・indexOf・find・findIndex)

値そのものを探す場合と、条件に合う要素を探す場合で使うメソッドが異なります。

const fruits = ["りんご", "みかん", "ぶどう"];

console.log(fruits.includes("みかん")); // true(存在するかどうか)
console.log(fruits.indexOf("ぶどう")); // 2(見つかった位置。無ければ-1)

オブジェクトが入った配列から条件に合う要素を探す場合は、findfindIndexが便利です。

const users = [
    { id: 1, name: "佐藤" },
    { id: 2, name: "鈴木" },
];

const user = users.find((u) => u.id === 2);
console.log(user); // { id: 2, name: "鈴木" }(最初に条件に一致した要素)

const index = users.findIndex((u) => u.id === 2);
console.log(index); // 1(一致した要素の位置)

繰り返し処理(forEach)

配列の全要素に同じ処理をしたい場合はforEachを使います。

const prices = [100, 200, 300];

prices.forEach((price, index) => {
    console.log(`${index}番目:${price}円`);
});
// 0番目:100円
// 1番目:200円
// 2番目:300円

コールバック関数の第1引数が要素、第2引数が添字(インデックス)です。従来のfor文より簡潔に書けますが、forEachはループを途中で止める(breakする)ことができない点に注意してください(詳しくは後述のQ&Aで解説します)。

配列の変換・抽出・集計(map・filter・reduce)

配列を扱ううえで最もよく使う3つのメソッドです。用途を混同しないよう、役割の違いを押さえておきましょう。

const prices = [100, 200, 300];

// map:全要素を変換した「新しい配列」を作る
const taxedPrices = prices.map((price) => Math.floor(price * 1.1));
console.log(taxedPrices); // [110, 220, 330]

// filter:条件に合う要素だけを抜き出した「新しい配列」を作る
const highPrices = prices.filter((price) => price >= 200);
console.log(highPrices); // [200, 300]

// reduce:全要素を1つの値にまとめる
const total = prices.reduce((sum, price) => sum + price, 0);
console.log(total); // 600

reduceの第2引数(上の例では0)は集計の初期値です。これを省略すると、配列が空のときにエラーになります。合計を求める場合は基本的に初期値0を明示しておくと安全です。

mapfilterは元の配列を変更せず新しい配列を返すため、prices.filter(...).map(...)のようにつなげて書くこともできます。

並び替え(sort・reverse)

配列の順序を並び替えるメソッドです。数値の並び替えには注意が必要です。

const numbers = [40, 100, 5, 25];

numbers.sort();
console.log(numbers); // [100, 25, 40, 5](文字列として比較されるため意図通りにならない)

numbers.sort((a, b) => a - b);
console.log(numbers); // [5, 25, 40, 100](昇順)

numbers.sort((a, b) => b - a);
console.log(numbers); // [100, 40, 25, 5](降順)

sortは比較関数を渡さないと要素を文字列として比較するため、数値の配列では"100""25"より前に来るような直感に反する結果になります。数値を並び替える場合は、必ず(a, b) => a - b(昇順)または(a, b) => b - a(降順)を渡してください。

const fruits = ["りんご", "みかん", "ぶどう"];

fruits.reverse();
console.log(fruits); // ["ぶどう", "みかん", "りんご"](並び順をそのまま反転)

sortreverse元の配列そのものを書き換える点が、新しい配列を返すmapfilterと異なります。元の配列を残しておきたい場合は、[...numbers].sort(...)のようにコピーしてから並び替えましょう。

実務サンプル(在庫リストの絞り込みと合計金額表示)

ここまで紹介したfiltermapreduceを組み合わせて、在庫データから在庫不足の商品を抜き出し、在庫金額の合計を計算するサンプルです。

HTML

<div id="stockList"></div>

JavaScript(main.js)

document.addEventListener("DOMContentLoaded", () => {
    const items = [
        { name: "コピー用紙", stock: 3, price: 500 },
        { name: "ボールペン", stock: 25, price: 100 },
        { name: "ファイル", stock: 2, price: 150 },
        { name: "付箋", stock: 40, price: 200 },
    ];

    const STOCK_THRESHOLD = 5; // この個数以下を在庫不足とみなす

    // filterで在庫不足の商品だけ抜き出す
    const lowStockItems = items.filter((item) => item.stock <= STOCK_THRESHOLD);

    // mapで表示用の文字列に変換
    const lowStockNames = lowStockItems.map((item) => `${item.name}(残り${item.stock})`);

    // reduceで全商品の在庫金額を合計
    const totalValue = items.reduce((sum, item) => sum + item.stock * item.price, 0);

    const list = document.getElementById("stockList");
    list.innerHTML = `
        <p>在庫不足の商品:${lowStockNames.join("、")}</p>
        <p>在庫金額の合計:${totalValue.toLocaleString()}円</p>
    `;
});

filterで条件に合う商品だけを抜き出し、その結果をmapで表示用の文字列に変換、さらに元のitems全体をreduceで集計する、という流れです。それぞれのメソッドが「新しい配列を返す」「1つの値にまとめる」という役割の違いを意識すると、処理の流れが追いやすくなります。

在庫不足の商品一覧と在庫金額の合計が表示された画面

よくある質問・エラー対処

Q. sortで数値が意図通りに並ばないのはなぜですか?

sortはデフォルトで要素を文字列として比較するためです。数値を並び替えたい場合は、比較関数(a, b) => a - b(昇順)を必ず渡してください。

Q. forEachのコールバック内でreturnしても処理を止められないのはなぜですか?

forEachの中のreturnは「その回の処理をスキップする」だけで、ループ全体を止める(breakする)効果はありません。途中で処理を打ち切りたい場合は、for...of文や従来のfor文breakを使ってください。

Q. 変数が配列かどうかを判定するにはどうすればいいですか?

Array.isArray(変数)を使います。typeofは配列も"object"と判定してしまい、通常のオブジェクトと区別できないため、配列かどうかの判定にはArray.isArrayを使ってください。

おわりに(まとめ)

まとめ

配列のメソッドを使いこなすと、複数データの操作をシンプルなコードで表現できます。

  • ✅ 配列は0始まりの添字でアクセスし、lengthで要素数を取得できる
  • ✅ push・pop・unshift・shiftで先頭・末尾を、spliceで任意の位置を追加・削除できる
  • ✅ includes・indexOfは値そのもの、find・findIndexはオブジェクト配列の検索に向く
  • ✅ map(変換)・filter(抽出)・reduce(集計)の組み合わせでデータ加工の大半をカバーできる
  • ✅ sortは文字列比較がデフォルトなので、数値の並び替えには比較関数を渡す

まずはfilter・mapの組み合わせから、身近なデータの絞り込みや変換に使ってみましょう。

次回は、正規表現について解説予定です。

この記事が、少しでも誰かのお役に立てれば幸いです。

関連記事

当サイトの記事で使用したVBAなどのサンプルをDLできます

この記事のサンプルはありません!

ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


【CSS】テキスト関連プロパティについて基本解説|Webの基礎


よかったらシェアしてね!
  • URLをコピーしました!
目次