需求
获取 url 中的参数
- 指定参数名称,返回该参数的值 或者 空字符串
- 不指定参数名称,返回全部的参数对象 或者 {}
- 如果存在多个同名参数,则返回数组
IN
OUT
[1, 2, 3]
解析
- 注意indexOf,push方法的返回值
- 用split,slice等js方法处理字符串
- 正则匹配RegExp分组捕获
- concat产生一个副本数组,reg.exec(),常量子捕获RegExp.$n
解法1
function getUrlParam(sUrl, sKey) {
var s = sUrl,
o = {}
// 范围
var q = s.indexOf('?') > -1 ? s.slice(s.indexOf('?') + 1) : ''
q = q.indexOf('#') > -1 ? q.slice(0, q.indexOf('#')) : q
// 组装
if (q) {
var brr = q.split('&'),
e
for (var i in brr) {
e = brr[i].split('=')
if (o[e[0]]) {
o[e[0]].push(e[1])
} else {
o[e[0]] = [e[1]]
}
}
// 格式化
for (var i in o) {
o[i] = o[i].length == 1 ? o[i][0] : o[i]
}
}
return sKey ? (o[sKey] ? o[sKey] : '') : o
}
浓缩版
function getUrlParam(sUrl, sKey) {
var obj = {};
var reg = /[?&](\w+)=(\w+)/g;
while (reg.exec(sUrl))
// concat产生一个新的副本不会改变原有的值域
obj[RegExp.$1] ? obj[RegExp.$1] = [].concat(obj[RegExp.$1], RegExp.$2) : obj[RegExp.$1] = RegExp.$2;
return sKey ? obj[sKey] || "" : obj;
}