Object.fromEntries 是 ES2019 引入的方法,可将键值对数组转为对象,配合 URLSearchParams 一行解析 URL 查询参数;需手动处理重复键、类型转换及旧环境兼容性。

Object.fromEntries 是 ES2019 引入的方法,能直接把键值对数组转成对象,配合 URLSearchParams 使用,是解析 URL 查询参数最简洁的方式。
一步到位:用 fromEntries + URLSearchParams
浏览器原生支持 URLSearchParams,它能把查询字符串(如 "name=Tom&age=25")解析成可遍历的键值对。结合 Object.fromEntries() 就能一行转对象:
const url = "https://example.com/?name=Tom&age=25&city=%E5%8C%97%E4%BA%AC";
const params = Object.fromEntries(new URLSearchParams(new URL(url).search));
// { name: "Tom", age: "25", city: "北京" }
注意:URLSearchParams 返回的值全是字符串,数字、布尔等类型不会自动转换,需后续处理。
处理重复键和数组场景
如果 URL 中有重复参数(如 ?tag=a&tag=b),URLSearchParams 默认只保留最后一个值。要支持多值(如转为数组),得手动聚合:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先用
Array.from(searchParams.entries())获取所有键值对 - 用
reduce按 key 分组,相同 key 的值推入数组 - 再用
Object.fromEntries转对象(此时 value 是数组)
const searchParams = new URLSearchParams("tag=a&tag=b&mode=dark");
const entries = Array.from(searchParams.entries());
const grouped = entries.reduce((acc, [key, value]) => {
if (!acc.has(key)) acc.set(key, []);
acc.get(key).push(value);
return acc;
}, new Map());
const result = Object.fromEntries(grouped); // { tag: ["a", "b"], mode: ["dark"] }
兼容性与降级方案
Object.fromEntries 在现代浏览器和 Node.js 12+ 中可用。若需支持旧环境(如 IE 或早期 Node),可用 Object.assign + map 替代:
const params = Object.assign(
{},
...Array.from(new URLSearchParams(window.location.search)).map(
([k, v]) => ({ [k]: v })
)
);
但这种写法无法处理重复 key,且可读性略差,建议优先用原生方案,必要时再 polyfill。
小技巧:自动类型转换
如果希望数字、布尔、null 等自动转换,可在转对象后加一层映射:
- 遍历对象每个值,用
JSON.parse()尝试解析(适用于"true"、"123"、"null") - 捕获异常则保留原字符串
const parsed = Object.fromEntries(new URLSearchParams(search));
Object.keys(parsed).forEach(key => {
try {
const val = JSON.parse(parsed[key]);
parsed[key] = val;
} catch (e) {}
});
不复杂但容易忽略

















