parsequery 函数用 reduce 将 url 查询字符串解析为对象:先去除前导 ?,空则返回 {};再按 & 拆分键值对,对每对用 = 拆分 key/val,解码后存入累积对象,异常时忽略。

用 reduce 解析 URL 查询参数字符串为对象,核心是先按 & 拆分键值对,再对每对用 = 拆分 key 和 value,最后用 decodeURIComponent 解码,并通过 reduce 累积成对象。
处理空字符串和开头的 ?
查询字符串可能带前导 ?(如 ?name=jack&age=25),也可能是空或只有 ?。建议先清理:
- 用
urlParams.replace(/^\?/, '')去掉开头的? - 若结果为空字符串,直接返回空对象
{}
按 & 拆分并 reduce 累积
将清洗后的字符串用 .split('&') 得到键值对数组,再用 reduce 遍历,初始值设为 {}:
- 对每个项(如
"name=jack")用.split('=', 2)拆成最多两项(防 value 中含=) - 解构得到
[key, val],若没=(如"debug"),则val为undefined,可设默认值"" - 用
decodeURIComponent分别解码 key 和 val(注意捕获 URIError 异常,避免崩溃)
完整可运行示例
以下代码可直接使用,已处理常见边界情况:
function parseQuery(str) {
const clean = str.replace(/^\?/, '');
if (!clean) return {};
return clean.split('&').reduce((acc, pair) => {
const [key, val] = pair.split('=', 2);
try {
const decodedKey = decodeURIComponent(key || '');
const decodedVal = val === undefined ? '' : decodeURIComponent(val);
acc[decodedKey] = decodedVal;
} catch (e) {
// 忽略无法解码的项,保持已有结果
}
return acc;
}, {});
}
// 示例
parseQuery('?name=John%20Doe&city=%E4%B8%8A%E6%B5%B7&debug');
// → { name: 'John Doe', city: '上海', debug: '' }
注意重复 key 的情况
reduce 默认会覆盖同名 key —— 后出现的值替代前面的。如果需要支持数组形式(如多个 id=1&id=2),需手动判断 key 是否已存在,并转为数组:
- 若
acc[key]已存在且不是数组,先转成[acc[key]] - 再用
Array.isArray(acc[key]) ? acc[key].push(val) : acc[key] = [val]
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











