我正在使用 David Dorward 的答案,并意识到它的行为不像 PHP 或 Ruby on Rails 解析参数的方式:
1) 一个变量只是一个数组,如果它以 结尾[]
,例如?choice[]=1&choice[]=12
,而不是当它是?a=1&a=2
2) 当多个参数存在同名时,后面的会替换前面的,如在 PHP 服务器上(Ruby on Rails 保留第一个,忽略后面的),例如 ?a=1&b=2&a=3
所以修改大卫的版本,我有:
function QueryStringToHash(query) {
if (query == '') return null;
var hash = {};
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
var k = decodeURIComponent(pair[0]);
var v = decodeURIComponent(pair[1]);
// If it is the first entry with this name
if (typeof hash[k] === "undefined") {
if (k.substr(k.length-2) != '[]') // not end with []. cannot use negative index as IE doesn't understand it
hash[k] = v;
else
hash[k.substr(0, k.length-2)] = [v];
// If subsequent entry with this name and not array
} else if (typeof hash[k] === "string") {
hash[k] = v; // replace it
// If subsequent entry with this name and is array
} else {
hash[k.substr(0, k.length-2)].push(v);
}
}
return hash;
};
这是相当彻底的测试。