組み込み関数

JavaScriptのsplice()入門|配列の追加・削除・置換を行う

splice()は、配列の任意の位置で要素の追加・削除・置換ができる万能メソッドです。push()/pop()/shift()/unshift()が先頭や末尾の操作に限定されるのに対し、splice()は配列のどの位置でも操作できます。元の配列を直接変更する破壊的メソッドです。

基本的な使い方

splice()は最大3種類の引数を取ります。第1引数は操作開始位置、第2引数は削除する要素数、第3引数以降は挿入する要素です。戻り値は削除された要素の配列です。

JavaScript
// 基本構文
array.splice(開始位置, 削除数, 挿入要素1, 挿入要素2, ...);

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

// 削除のみ:インデックス1から2つ削除
const removed = fruits.splice(1, 2);
console.log("削除された:", removed);
console.log("残り:", fruits);

// 挿入のみ:インデックス1に追加(削除数0)
fruits.splice(1, 0, "メロン", "キウイ");
console.log("挿入後:", fruits);

// 置換:インデックス0の1つを置き換え
fruits.splice(0, 1, "なし");
console.log("置換後:", fruits);
実行結果
削除された: ["バナナ", "みかん"]
残り: ["りんご", "いちご", "ぶどう"]
挿入後: ["りんご", "メロン", "キウイ", "いちご", "ぶどう"]
置換後: ["なし", "メロン", "キウイ", "いちご", "ぶどう"]

削除・挿入・置換のパターン

引数の組み合わせによって、削除のみ・挿入のみ・置換の3つの操作パターンになります。

JavaScript
// パターン1: 削除のみ
const arr1 = [1, 2, 3, 4, 5];
arr1.splice(2, 1); // インデックス2から1つ削除
console.log("削除のみ:", arr1);

// パターン2: 挿入のみ(削除数を0にする)
const arr2 = [1, 2, 5, 6];
arr2.splice(2, 0, 3, 4); // インデックス2に3, 4を挿入
console.log("挿入のみ:", arr2);

// パターン3: 置換(削除して同時に挿入)
const arr3 = ["月", "火", "木", "金"];
arr3.splice(2, 0, "水"); // 水曜を追加
console.log("置換:", arr3);

// 負のインデックスも使える
const arr4 = [1, 2, 3, 4, 5];
arr4.splice(-2, 1); // 末尾から2番目を削除
console.log("負のインデックス:", arr4);
実行結果
削除のみ: [1, 2, 4, 5]
挿入のみ: [1, 2, 3, 4, 5, 6]
置換: ["月", "火", "水", "木", "金"]
負のインデックス: [1, 2, 3, 5]

実践的な活用例

splice()はリストの並べ替え、条件付き要素の削除、配列の一部置換に使えます。

JavaScript
// ドラッグ&ドロップの並べ替えをシミュレート
const items = ["タスクA", "タスクB", "タスクC", "タスクD"];
console.log("変更前:", items);

// タスクCをインデックス2から0に移動
const [movedItem] = items.splice(2, 1); // 取り出し
items.splice(0, 0, movedItem);           // 挿入
console.log("変更後:", items);

// 条件に合う要素を削除
const numbers = [10, 25, 30, 15, 45, 20];
// 30以上の要素を後ろから削除(前からだとインデックスがずれる)
for (let i = numbers.length - 1; i >= 0; i--) {
  if (numbers[i] >= 30) {
    numbers.splice(i, 1);
  }
}
console.log("30未満のみ:", numbers);

// toSpliced() - 非破壊版(ES2023)
const original = [1, 2, 3, 4, 5];
const modified = original.toSpliced(1, 2, 10, 20);
console.log("元の配列:", original);
console.log("変更後:", modified);
実行結果
変更前: ["タスクA", "タスクB", "タスクC", "タスクD"]
変更後: ["タスクC", "タスクA", "タスクB", "タスクD"]
30未満のみ: [10, 25, 15, 20]
元の配列: [1, 2, 3, 4, 5]
変更後: [1, 10, 20, 4, 5]
toSpliced()について

ES2023で追加されたtoSpliced()は、splice()の非破壊版です。元の配列を変更せず、操作結果の新しい配列を返します。イミュータブルな操作が必要な場合に使用します。

ループ内でのsplice()に注意

splice()で要素を削除すると配列の長さとインデックスが変化します。forループ内で前方から削除すると要素がスキップされます。後方からループするか、filter()で新しい配列を作成する方が安全です。

まとめ

  • splice()は配列の任意位置で追加・削除・置換ができる万能メソッド
  • 戻り値は削除された要素の配列
  • 削除数を0にすれば純粋な挿入、挿入要素なしなら純粋な削除
  • ループ内で使う場合はインデックスのずれに注意
  • ES2023のtoSpliced()で非破壊的な操作が可能