function parseParam(url) {
const paramsStr = /.+\?(.+)$/.exec(url)[1]; // 将 ? 后面的字符串取出来
const paramsArr = paramsStr.split('&'); // 将字符串以 & 分割后存到数组中
let paramsObj = {};
// 将 params 存到对象中
paramsArr.forEach(param => {
if (/=/.test(param)) { // 处理有 value 的参数
let [key, val] = param.split('='); // 分割 key 和 value
val = decodeURIComponent(val); // 解码
val = /^\d+$/.test(val) ? parseFloat(val) : val; // 判断是否转为数字
if (paramsObj.hasOwnProperty(key)) { // 如果对象有 key,则添加一个值
paramsObj[key] = [].concat(paramsObj[key], val);
} else { // 如果对象没有这个 key,创建 key 并设置值
paramsObj[key] = val;
}
} else { // 处理没有 value 的参数
paramsObj[param] = true;
}
})
return paramsObj;
}
let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
console.log(parseParam(url));
function parseParams(url) {
let params = {}; // 定义一个空对象用于存放解析出来的参数
let startIndex = url.indexOf('?'); // 查找url中参数部分的起始位置
if (startIndex !== -1) { // 如果存在参数部分
let paramStr = url.substr(startIndex + 1); // 截取参数部分的字符串
let paramArr = paramStr.split('&'); // 将参数字符串按&符号分割成数组
paramArr.forEach(function(item) {
let itemArr = item.split('='); // 将每个参数项按=符号分割成数组
let key = decodeURIComponent(itemArr[0]); // 解码key
let value = itemArr.length > 1 ? decodeURIComponent(itemArr[1]) : ''; // 解码value
if (params.hasOwnProperty(key)) { // 如果已经存在该key,则将解析出来的值以数组形式保存
params[key] = [].concat(params[key], value);
} else {
params[key] = value; // 否则直接保存
}
});
}
return params; // 返回解析出来的参数对象
}
let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
console.log(parseParams(url));