JavaScript/URLSearchParams

URLSearchParamsオブジェクト

はじめに

Webアプリケーション開発において、URLのクエリパラメータを操作することは非常に重要な作業です。JavaScriptでは、URLSearchParamsオブジェクトを使用することで、URLのクエリ文字列を簡単に解析したり、操作したりすることができます。本章では、URLSearchParamsオブジェクトの基本的な使い方から応用までを詳しく解説します。

URLSearchParamsとは

URLSearchParamsオブジェクトは、URLのクエリ部分(?以降の部分)を操作するためのインターフェースを提供します。このオブジェクトを使用することで、クエリパラメータの取得、追加、削除、更新などの操作を簡単に行うことができます。

従来は、クエリパラメータを操作するために、文字列の分割や正規表現を使用するなど、煩雑な処理が必要でしたが、URLSearchParamsオブジェクトを使用することでこれらの処理が大幅に簡素化されました。

URLSearchParamsオブジェクトの生成

URLSearchParamsオブジェクトを生成するには、以下のようにいくつかの方法があります。

クエリ文字列から生成

// クエリ文字列から生成(先頭の?は含めても含めなくても良い)
const params1 = new URLSearchParams("name=田中&age=30");
const params2 = new URLSearchParams("?name=田中&age=30");

オブジェクトから生成

// オブジェクトから生成
const params = new URLSearchParams({
  name: "田中",
  age: 30,
  hobby: ["読書", "旅行"]
});

URLオブジェクトのsearchプロパティから生成

// URLオブジェクトから検索パラメータを取得
const url = new URL("https://example.com/search?name=田中&age=30");
const params = url.searchParams;  // URLSearchParamsオブジェクトが取得できる

基本的な操作

URLSearchParamsオブジェクトには、クエリパラメータを操作するための様々なメソッドが用意されています。

パラメータの取得

const params = new URLSearchParams("name=田中&age=30&tag=javascript&tag=programming");

// 特定のパラメータの値を取得(最初の値のみ)
const name = params.get("name");  // "田中"
const age = params.get("age");    // "30"
const notFound = params.get("email");  // null(存在しない場合はnull)

// 特定のパラメータの全ての値を取得(配列として)
const tags = params.getAll("tag");  // ["javascript", "programming"]

// パラメータの存在チェック
const hasName = params.has("name");  // true
const hasEmail = params.has("email");  // false

パラメータの追加・設定

const params = new URLSearchParams();

// パラメータの追加(同じキーを複数追加可能)
params.append("tag", "javascript");
params.append("tag", "programming");
console.log(params.toString());  // "tag=javascript&tag=programming"

// パラメータの設定(既存の値を上書き)
params.set("tag", "coding");
console.log(params.toString());  // "tag=coding"

// 複数のパラメータを一度に設定
params.set("name", "田中");
params.set("age", "30");
console.log(params.toString());  // "tag=coding&name=田中&age=30"

パラメータの削除

const params = new URLSearchParams("name=田中&age=30&tag=javascript&tag=programming");

// 特定のパラメータを削除
params.delete("age");
console.log(params.toString());  // "name=田中&tag=javascript&tag=programming"

// 特定のキーの全てのパラメータを削除
params.delete("tag");
console.log(params.toString());  // "name=田中"

パラメータの一括操作

const params = new URLSearchParams("name=田中&age=30");

// 全てのパラメータをクリア
params.forEach((value, key) => {
  console.log(`${key}: ${value}`);  // "name: 田中", "age: 30"
});

// 全てのキーを取得
for (const key of params.keys()) {
  console.log(key);  // "name", "age"
}

// 全ての値を取得
for (const value of params.values()) {
  console.log(value);  // "田中", "30"
}

// 全てのエントリー([key, value]のペア)を取得
for (const [key, value] of params.entries()) {
  console.log(`${key}: ${value}`);  // "name: 田中", "age: 30"
}

// 全てのエントリーを取得(Iterator)
const iterator = params.entries();
console.log(iterator.next().value);  // ["name", "田中"]
console.log(iterator.next().value);  // ["age", "30"]

クエリ文字列への変換

const params = new URLSearchParams();
params.set("name", "田中");
params.set("age", "30");

// クエリ文字列に変換
const queryString = params.toString();  // "name=田中&age=30"

// URLに適用
const url = new URL("https://example.com");
url.search = params.toString();
console.log(url.href);  // "https://example.com/?name=田中&age=30"

// または直接URLSearchParamsを設定
const url2 = new URL("https://example.com");
url2.searchParams.append("name", "田中");
url2.searchParams.append("age", "30");
console.log(url2.href);  // "https://example.com/?name=田中&age=30"

注意点と便利な使い方

文字列の自動エンコード

URLSearchParamsは自動的に値をURLエンコードするため、手動でエンコードする必要がありません。

const params = new URLSearchParams();
params.set("q", "JavaScriptとは?");
console.log(params.toString());  // "q=JavaScript%E3%81%A8%E3%81%AF%EF%BC%9F"

// すでにエンコードされた文字列を使用する場合は注意
const encodedParam = new URLSearchParams("q=JavaScript%E3%81%A8%E3%81%AF%EF%BC%9F");
console.log(encodedParam.get("q"));  // "JavaScriptとは?"(自動的にデコードされる)

数値と真偽値の扱い

URLSearchParamsは全ての値を文字列として扱います。数値や真偽値を設定する場合は、文字列に変換されることに注意しましょう。

const params = new URLSearchParams();
params.set("age", 30);         // 数値を設定
params.set("active", true);    // 真偽値を設定

console.log(params.get("age"));     // "30"(文字列)
console.log(params.get("active"));  // "true"(文字列)

// 数値に変換
const age = parseInt(params.get("age"), 10);  // 30(数値)

// 真偽値に変換
const active = params.get("active") === "true";  // true(真偽値)

同じキーを持つ複数のパラメータの扱い

Webフォームなどでは、同じ名前の複数のパラメータが送信されることがあります。URLSearchParamsでは、appendメソッドとgetAllメソッドを使用して、このような状況に対応できます。

// チェックボックスのグループなどで同じ名前の複数のパラメータがある場合
const params = new URLSearchParams();
params.append("hobby", "読書");
params.append("hobby", "旅行");
params.append("hobby", "料理");

// すべての値を取得
const hobbies = params.getAll("hobby");  // ["読書", "旅行", "料理"]

// 最初の値のみ取得
const firstHobby = params.get("hobby");  // "読書"

フォームデータとの連携

URLSearchParamsFormDataオブジェクトと連携して使用することもできます。

// フォーム要素の取得
const form = document.querySelector("#search-form");

// フォームデータからURLSearchParamsを生成
const params = new URLSearchParams(new FormData(form));

// または手動でフォームの値を設定
const formData = new FormData();
formData.append("name", "田中");
formData.append("age", "30");
const params2 = new URLSearchParams(formData);

// クエリ文字列に変換
console.log(params2.toString());  // "name=田中&age=30"

URLSearchParamsの便利なユースケース

ページネーションの実装
function updatePagination(page) {
  const url = new URL(window.location.href);
  url.searchParams.set("page", page);
  window.history.pushState({}, "", url);
  loadContent(page);
}

function initPagination() {
  const url = new URL(window.location.href);
  const currentPage = url.searchParams.get("page") || "1";
  loadContent(parseInt(currentPage, 10));
}
フィルタリングと並べ替え
function applyFilters() {
  const url = new URL(window.location.href);
  const filters = {
    category: document.querySelector("#category").value,
    minPrice: document.querySelector("#min-price").value,
    maxPrice: document.querySelector("#max-price").value,
    sortBy: document.querySelector("#sort-by").value
  };

  // 空の値を除外
  Object.entries(filters).forEach(([key, value]) => {
    if (value) {
      url.searchParams.set(key, value);
    } else {
      url.searchParams.delete(key);
    }
  });

  window.history.pushState({}, "", url);
  loadFilteredContent();
}

ブラウザの互換性

URLSearchParamsは比較的新しいAPIですが、ほとんどのモダンブラウザでサポートされています。以下の表は、主要なブラウザでの対応状況です。

ブラウザ バージョン
Chrome 49以上
Firefox 29以上
Safari 10.1以上
Edge 17以上
Internet Explorer 未対応

Internet Explorerでは対応していないため、必要に応じてポリフィルを使用することを検討してください。

ポリフィルの使用

Internet Explorerなどの古いブラウザでURLSearchParamsを使用するには、ポリフィルを利用します。以下は、ポリフィルの導入例です。

// URLSearchParamsのポリフィル
if (!window.URLSearchParams) {
  window.URLSearchParams = function(init) {
    this.params = new Map();
    
    if (init) {
      // 初期化処理(簡略化版)
      if (typeof init === 'string') {
        init = init.replace(/^\?/, '');
        const pairs = init.split('&');
        for (const pair of pairs) {
          const [key, value] = pair.split('=');
          this.append(
            decodeURIComponent(key), 
            value ? decodeURIComponent(value) : ''
          );
        }
      }
    }
  };

  URLSearchParams.prototype.append = function(name, value) {
    if (!this.params.has(name)) {
      this.params.set(name, []);
    }
    this.params.get(name).push(String(value));
  };

  URLSearchParams.prototype.get = function(name) {
    const values = this.params.get(name);
    return values ? values[0] : null;
  };

  // その他のメソッドも実装
  // ...
};

まとめ

URLSearchParamsオブジェクトは、URLのクエリパラメータを扱う際に非常に便利なツールです。適切に活用することで、以下のようなメリットがあります。

  1. クエリパラメータの解析が簡単になる
  2. パラメータの追加、更新、削除などの操作が直感的に行える
  3. URLエンコード・デコードを自動的に処理してくれる
  4. 同じキーを持つ複数のパラメータも簡単に扱える

Webアプリケーション開発において、特にユーザーの検索条件やフィルター条件をURLに反映させる場合など、様々なシーンで活躍するAPIです。URLの操作が必要な場面では、ぜひURLSearchParamsオブジェクトの使用を検討してみてください。

附録

静的プロパティ

URLSearchParams.arguments
URLSearchParams.caller
URLSearchParams.length
URLSearchParams.name
URLSearchParams.prototype

静的アクセサ

静的メソッド

URLSearchParamsのインスタンスプロパティ

URLSearchParams.prototype [ Symbol.toStringTag ]

URLSearchParamsのインスタンスアクセサ

get URLSearchParams.prototype.size

URLSearchParamsのインスタンスメソッド

URLSearchParams.prototype.append()
URLSearchParams.prototype.constructor()
URLSearchParams.prototype.delete()
URLSearchParams.prototype.entries()
URLSearchParams.prototype.forEach()
URLSearchParams.prototype.get()
URLSearchParams.prototype.getAll()
URLSearchParams.prototype.has()
URLSearchParams.prototype.keys()
URLSearchParams.prototype.set()
URLSearchParams.prototype.sort()
URLSearchParams.prototype.toString()
URLSearchParams.prototype.values()
URLSearchParams.prototype [ Symbol.iterator ] ()
カテゴリ:JavaScript
カテゴリ:JavaScript