Skip to content

快速获取 URL 中的参数

关于

以前想要获取 url 中的参数都是使用 split 进行分割,一层一层嵌套极其繁琐。

最近看到一篇文章,讲解封装 split 和正则解法,文章没什么意思。

但是自古评论出人才,评论里提出了一条我没有走过的路。

注意:

以下方法存在版本要求,不兼容全系 IE 浏览器!!!

实现

URL 对象有一个 searchParams 属性,提供了一些处理 URL 的实用方法。

PS: searchParams 也可以通过 new URLSearchParams() 直接生成。

通过 window.location 获取的对象可以使用 new URL() 进行再次转换,或者通过 new URLSearchParams() 获取参数对象。

如果想要获取字符串中的参数可以直接通过 new URL() 来转变为 URL 对象

js
// 将字符串内容转换为 URL 对象,注意此处必须为有效链接,否则会抛出一个 TypeError
const _URL = new URL('https://www.baidu.com?a=1&b=2')

// 为演示,统一 URL 对象,正常可以使用 new URLSearchParams(window.location.search)
const _LOCATION = new URL(window.location)

通过 Object.fromEntries() 转换为对象形式。

js
// 获取 URL 对象的 searchParams
Object.fromEntries(new URL('https://www.baidu.com?a=1&b=2').searchParams) // {a: '1', b: '2'}

// 请自行模拟网址
// URLSearchParams 构造函数不会解析完整 URL,但是如果字符串起始位置有 ? 的话会被去除。
Object.fromEntries(new URLSearchParams(window.location.search)) // {a: '1', b: '2'}

此方法相较原来的 split 分割简单了很多,但是 new URL 无法兼容全系 IE 浏览器,如果要做兼容的话,还是换条路吧。

扩展

new URLSearchParams 还提供了很多实用的方法:

js
// URLSearchParams 构造函数不会解析完整 URL,但是如果字符串起始位置有 ? 的话会被去除。
console.log(new URLSearchParams('https://www.baidu.com?a=1&b=2'))
// https://www.baidu.com?a 1
// b 2

const _URLP = new URLSearchParams('?a=1&b=2') // 返回一个 URLSearchParams 对象

// 遍历 URLSearchParams 属性值,_URLP 同 _URLP.entries() 实现效果相同
for (const [key, value] of _URLP) {
  console.log(key, value)
}
// a 1
// b 2

// 插入一个参数及值
_URLP.append('c', 3)

// 删除指定参数及值
_URLP.delete('b')

// 返回一个 iterator 可以遍历所有键值对
_URLP.entries()

// 获取指定搜索参数的第一个值
_URLP.get('a') // '1'

// 获取指定搜索参数的所有值,返回是一个数组。(如果值重复)
_URLP.getAll('a') // ['1']

// 返回一个 Boolean 判别是否存在此参数
_URLP.has('a') // true

// 返回 iterator 此对象包含了键/值对的所有键名。
_URLP.keys()

// 设置一个搜索参数的新值,假如原来有多个值将删除其他所有的值
_URLP.set('')

// 按键名排序
_URLP.sort()

// 返回搜索参数组成的字符串,可直接使用在URL上
_URLP.toString() // 'a=1&c=3'

// 返回iterator 此对象包含了键/值对的所有值。
_URLP.values()

Released under the MIT License.