組み込み関数

JavaScriptのshift()入門|配列の先頭要素を削除・取得する

shift()は、配列の先頭から要素を1つ取り出して返すメソッドです。残りの要素はインデックスが1つずつ前にずれます。キュー(先入れ先出し)データ構造の実装や、配列の先頭要素の順次処理に使われます。元の配列を直接変更する破壊的メソッドです。

基本的な使い方

shift()は引数を取らず、配列の先頭要素を削除して返します。配列が空の場合はundefinedを返します。

JavaScript
const colors = ["赤", "青", "緑", "黄"];

// 先頭の要素を取り出す
const first = colors.shift();
console.log("取り出した要素:", first);
console.log("残りの配列:", colors);

// もう一度取り出す
const second = colors.shift();
console.log("取り出した要素:", second);
console.log("残りの配列:", colors);

// 空の配列からshift
const empty = [];
console.log(empty.shift());
実行結果
取り出した要素: 赤
残りの配列: ["青", "緑", "黄"]
取り出した要素: 青
残りの配列: ["緑", "黄"]
undefined

キュー構造の実装

push()で末尾に追加し、shift()で先頭から取り出すことで、FIFO(First In, First Out)のキューを実装できます。タスク処理や待ち行列の管理に使われるパターンです。

JavaScript
// タスクキュー(先入れ先出し)
const queue = [];

// タスクを追加(enqueue)
function enqueue(task) {
  queue.push(task);
  console.log(`追加: ${task} | キュー: [${queue}]`);
}

// タスクを処理(dequeue)
function dequeue() {
  if (queue.length === 0) {
    console.log("キューは空です");
    return null;
  }
  const task = queue.shift();
  console.log(`処理: ${task} | 残り: [${queue}]`);
  return task;
}

enqueue("注文A");
enqueue("注文B");
enqueue("注文C");
dequeue();
dequeue();
enqueue("注文D");
dequeue();
実行結果
追加: 注文A | キュー: [注文A]
追加: 注文B | キュー: [注文A,注文B]
追加: 注文C | キュー: [注文A,注文B,注文C]
処理: 注文A | 残り: [注文B,注文C]
処理: 注文B | 残り: [注文C]
追加: 注文D | キュー: [注文C,注文D]
処理: 注文C | 残り: [注文D]

実践的な活用例

shift()は配列の先頭要素を順次処理する場面やCSVデータのヘッダー行除去などに便利です。

JavaScript
// CSVデータのヘッダーと本文を分離
const csvLines = [
  "名前,年齢,部署",
  "田中,28,開発部",
  "佐藤,35,営業部",
  "鈴木,24,開発部"
];

const header = csvLines.shift(); // ヘッダー行を取得
const columns = header.split(",");
console.log("カラム:", columns);

const data = csvLines.map(line => {
  const values = line.split(",");
  return Object.fromEntries(columns.map((col, i) => [col, values[i]]));
});
console.log(data);

// ラウンドロビン方式の割り当て
const workers = ["田中", "佐藤", "鈴木"];
const tasks = ["タスクA", "タスクB", "タスクC", "タスクD", "タスクE"];

tasks.forEach(task => {
  const worker = workers.shift(); // 先頭を取り出す
  console.log(`${task} → ${worker}`);
  workers.push(worker); // 末尾に戻す
});
実行結果
カラム: ["名前", "年齢", "部署"]
[
  { "名前": "田中", "年齢": "28", "部署": "開発部" },
  { "名前": "佐藤", "年齢": "35", "部署": "営業部" },
  { "名前": "鈴木", "年齢": "24", "部署": "開発部" }
]
タスクA → 田中
タスクB → 佐藤
タスクC → 鈴木
タスクD → 田中
タスクE → 佐藤
shift()のパフォーマンス

shift()は先頭要素を削除した後、残りの全要素のインデックスを再割り当てするため、pop()よりもパフォーマンスが低くなります。大きな配列で頻繁に使用する場合は注意が必要です。

注意点

shift()は破壊的メソッドで元の配列を変更します。先頭要素の参照だけが必要な場合はarray[0]array.at(0)を使ってください。また、大きな配列でキュー操作が頻繁に必要な場合は、連結リストなどのデータ構造を検討してください。

まとめ

  • shift()は配列の先頭から要素を取り出す破壊的メソッド
  • 空の配列ではundefinedを返す
  • push()と組み合わせてキュー(FIFO)を実装できる
  • 全要素のインデックス再割り当てが発生するため大きな配列では注意
  • 先頭の参照だけならarray[0]で非破壊的にアクセスする