2012年3月12日月曜日

[JavaScript][PHP] オブジェクトからクエリストリングを作る

以前クエリストリング(URLパラメータ、GETパラメータって呼ばれたりもする)から
オブジェクトを作るということをやったので今度はその逆で
オブジェクトからクエリストリングを作るのをやってみたいと思う。
ちなみに、クエリストリングのキーの部分が数字のみになる場合のプレフィックスはつけてない。

//link・・・http://mio-koduki.blogspot.com/2012/03/javascriptphp_12.html
//第一引数・・・クエリストリングにしたいオブジェクト
//返り値・・・オブジェクトからビルドされたクエリストリング
function build_query(data)
{
    if(is_array(data)||is_object(data))
    {
        var params=[];
        for(var i in data)
        {
            if(is_array(data[i])||is_object(data[i]))
            {
                params.push(build(i,data[i]));
            }
            else if(is_can_format_value(data[i]))
            {
                params.push(url_encode(i)+"="+url_encode(format_value(data[i])));
            }
        }
        return params.join('&');
    }
    else
    {
        throw new Error('Parameter 1 expected to be Array or Object.');
    }

    function build(key,data)
    {
        var params=[];
        for(var i in data)
        {
            if(is_array(data[i])||is_object(data[i]))
            {
                params.push(build(key+'['+i+']',data[i]));
            }
            else if(is_can_format_value(data[i]))
            {
                params.push(url_encode(key+'['+i+']')+'='+url_encode(format_value(data[i])));
            }
        }
        return params.join('&');
    }

    function is_can_format_value(value)
    {
        return typeof value=='boolean'||typeof value=='string'||typeof value=='number';
    }

    function format_value(value)
    {
        if(value===true)
        {
            return 1;
        }
        else if(value===false)
        {
            return 0;
        }
        else
        {
            return value;
        }
    }

    function url_encode(string)
    {
        return encodeURIComponent((string+'')).replace(/!/g,'%21').replace(/'/g,'%27').replace(/\(/g,'%28').replace(/\)/g,'%29').replace(/\*/g,'%2A').replace(/%20/g,'+');
    }

    function is_array(data)
    {
        return data instanceof Array;
    }

    function is_object(data)
    {
        return data!=null&&typeof data=='object'&&Object.prototype.toString.call(data)!='[object Array]';
    }
}

と、こんな感じになると思う。
ちなみにPHPではhttp_build_queryが同じような挙動をする関数。

0 件のコメント:

コメントを投稿