parseQueryString

by ariehg

JavaScript

function each(arr,fn){
    var i,l;
    for (i=0,l=arr.length;i<l;i++) fn(arr[i],i);
}

function parseQueryString(str,decodeKeys, decodeValues) {
    if (decodeKeys == null) decodeKeys = true;
    if (decodeValues == null) decodeValues = true;

    var vars = str.split(/[&;]/),
        object = {};
    if (!vars.length) return object;

    each(vars,function(val) {
        var index = val.indexOf('=') + 1,
            value = index ? val.substr(index) : '',
            keys = index ? val.substr(0, index - 1).match(/([^\]\[]+|(\B)(?=\]))/g) : [val],
            obj = object;
        if (!keys) return;
        if (decodeValues) value = decodeURIComponent(value);
        keys.each(function(key, i) {
            if (decodeKeys) key = decodeURIComponent(key);
            var current = obj[key];

            if (i < keys.length - 1) obj = obj[key] = current || {};
            else if (typeOf(current) == 'array') current.push(value);
            else obj[key] = current != null ? [current, value] : value;
        });
    });

    return object;
}


console.log(parseQueryString("aaa=vvv&q=aaa&c=aa"));