スニぺったん

無料のコードスニペットを掲載しています。言語ごとにコードスニペットを検索し、利用することが可能です。コードのライセンスはトップページをご覧ください。

  • JavaScript
  • オブジェクトをURLクエリの文字列に変換する関数 (objToURLQuery)

オブジェクトをURLクエリの文字列に変換する関数 (objToURLQuery)

総合評価: - 作成日: 2025-11-12

コメント:
Braveブラウザで動作確認済み。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>objToURLQuery</title>
    <script>
        /**
         * オブジェクトをURLクエリの文字列に変換する。
         *
         * obj ... 変換するオブジェクト
         * dep ... 再帰用のカウント変数
         * sep ... セパレータ。デフォルトは'&'
         * eq ... 代入演算子。デフォルトは'='
         * wrap ... 値を囲むなら文字列指定(例: wrap: '"')
         * 
         * 返り値 ... 文字列
         */
        function objToURLQuery (obj, {
            dep=0,
            sep='&',
            eq='=',
            wrap=null,
        }={}) {
            let s = ''

            function _wrap (s) {
                s = '' + s

                if (!wrap) {
                    return s
                }
                let ret = ''
                ret += wrap

                for (let c of s) {
                    if (c === wrap) {
                        ret += '\\'
                    }
                    ret += c
                }

                ret += wrap
                return ret
            }

            if (dep === 0) {
                s += '?'
            }
            if (typeof obj === 'number' ||
                typeof obj === 'string') {
                s += '' + _wrap(obj)
                return s
            }

            for (let k in obj) {
                let v = obj[k]
                if (Array.isArray(v)) {
                    let vs = ''
                    for (let el of v) {
                        vs += objToURLQuery(el, { dep: dep+1 })
                        vs += ','
                    }
                    if (vs[vs.length-1] === ',') {
                        vs = vs.slice(0, -1)
                    }
                    s += k + eq + _wrap(vs)
                } else if (typeof v === 'object') {
                    s += k + eq + '{'
                    s += objToURLQuery(v, { 
                        dep: dep+1,
                        sep: ',',
                        eq: ':',
                        wrap: '"',
                    })
                    s += '}'
                } else {
                    s += k + eq + _wrap(v)
                }
                s += sep 
            }
            if (s[s.length-1] === sep) {
                s = s.slice(0, -1)
            }

            return s
        }

        document.addEventListener('DOMContentLoaded', () => {
            let s

            s = objToURLQuery({
                a: 123,
                b: 'bbb',
            })
            console.log(s)
            console.assert(s === '?a=123&b=bbb')

            s = objToURLQuery({
                a: 123,
                b: 'bbb',
            }, {
                wrap: '"',
            })
            console.log(s)
            console.assert(s === '?a="123"&b="bbb"')

            s = objToURLQuery({
                a: [1, '22', 3.14],
                b: {
                    c: 4,
                    d: 'd"D"d',
                    e: [5, 6],
                    f: { g: 7 }
                }
            })
            console.log(s)
            console.assert(s === '?a=1,22,3.14&b={c:"4",d:"d\\"D\\"d",e:"5,6",f:{g:"7"}}')

            console.log('OK')
        })
    </script>
</head>
<body>
</body>
</html>