1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【JavaScript】URLSearchParamsを使っていい感じにURLパラメータを作る

Last updated at Posted at 2022-10-10

概要

以前投稿した【JavaScript】URLパラメータを今風に取得する で使用したURLSearchParamsを使用すると、いい感じにURLパラメータを作ることができたのでそのメモです。

あんまりおしゃれでない実装(個人的主観)

location.href = '/search?'
    + (q ?? 'q=' + q)
    + (start ?? 'start=' + start)
    + ...

(パラメータはGoogle検索のキーワードとページ)
パラメータ指定があったらひたすら文字列結合をしていく方法。
パラメータが少ないうちはいいですが、なんか野暮ったい感じ。。。

いいかんじの実装(個人的主観)

  • URLパラメータをすべて作る
  • もともとのURLパラメータの内、一部分だけを書き換える

の2パターンの例を紹介します。

URLパラメータをすべて作る


const makeURLParameter = (obj) => {
    return new URLSearchParams(
        Object.fromEntries(
            Object.entries(obj).filter(
                ([_k, v]) => v !== undefined
            )
        )
    ).toString();
}

例えばこれで(同じドメイン内なら)

location.href = location.pathname
    + '?'
    + makeURLParameter(
        {
            q:'google',
            start: 20
        }
    );

のような呼び出しをすることで、パラメータ部分をすべて書き換えたURLに移動します。

もともとのURLパラメータの内、一部分だけを書き換える

もともとのURLパラメータが例えば?q=google&start=30&num=15という状態で、
q=youtube&start=30のようにもともと指定されているパラメータを残しつつ書き換えたい時の書き方です。

const remakeURLParameter = (obj) => {
    const oldParam = Object.fromEntries(new URLSearchParams(window.location.search));
    const newParam = { ...oldParam, ...obj };
    
    return new URLSearchParams(
        Object.fromEntries(
            Object.entries(newParam).filter(
                ([_k, v]) => v !== undefined
            )
        )
    ).toString();
}

本質的には上のものと同じですが、もとのURLを取得するために

  • new URLSearchParams(window.location.search)でもともとのURLパラメータを取得
  • それをObject.entries()で連想配列化
  • 引数で指定された連想配列をスプレッド構文で結合

として、それ以降は上のものと同じです。

呼び出し的には

location.href = location.pathname
    + '?'
    + remakeURLParameter(
        {
            q:'youtube',
            num: undefined
        }
    );

のように呼び出します。


もともとのURLパラメータの内、一部分だけを書き換える②

コメント欄@f03858 さんにご紹介頂いた実装を転載します。

const URLSearchParamsReplace = (params, baseURL = location.href) => {
  const url = new URL(baseURL);
  Object.entries(params).forEach(([key, value]) =>
    value === undefined ? url.searchParams.delete(key) : url.searchParams.set(key, value));

  return url.href;
};

console.log(URLSearchParamsReplace(
  // new search params
  {
    q: 'youtube',
    num: undefined,
  },

  // base url (省略可)
  'https://example.com/?q=google&start=30&num=15',
));
// https://example.com/?q=youtube&start=30

URLSearchParamsで用意されているURLSearchParams.deleteURLSearchParams.setを使用した実装ですね!

こちらの方がコードをぱっと見で見たときにパラメータにセットしてる、消してるがわかりやすいですね!
ありがとうございました!

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?