题目描述
获取 url 中的参数
1. 指定参数名称,返回该参数的值 或者 空字符串
2. 不指定参数名称,返回全部的参数对象 或者 {}
3. 如果存在多个同名参数,则返回数组
1. 指定参数名称,返回该参数的值 或者 空字符串
2. 不指定参数名称,返回全部的参数对象 或者 {}
3. 如果存在多个同名参数,则返回数组
输入例子:
getUrlParam('http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe', 'key')
输出例子:
[1, 2, 3]
大神的代码:
function getUrlParam(sUrl,sKey){ var result = {}; sUrl.replace(/\??(\w+)=(\w+)&?/g,function(a,k,v){ if(result[k] !== void 0){ var t = result[k]; result[k] = [].concat(t,v); }else{ result[k] = v; } }); if(sKey === void 0){ return result; }else{ return result[sKey] || ''; } }
需要好好看看正则表达式的replace用法。
a,v,k : a,模式的匹配项;k,第一个捕获组的匹配项;v,第二个捕获组的匹配项;
第一个参数a是整个匹配的字符串,接下来依次是正则里面的分组(就是括号括起来为一组);
ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数 是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。
void 0 是 undefined.
通过采用void 0取undefined比采用字面上的undefined更靠谱更安全,应该优先采用void 0这种方式。
function getUrlParam(sUrl, sKey) { var param = sUrl.split('#')[0].split('?')[1];//第一个split的意思是将sUrl以#为边界分割,[0]是指前面的字符串 //第二个split的意思是将前一个分割出来的字符串以?为边界分割,[1]是后面的字符串 if(sKey)//指定参数名 { var strs = param.split('&'); var arrs = new Array();//新建一个数组 var len = strs.length; for(var i=0;i<len;i++) { var tmp = strs[i].split('='); if(tmp[0]==sKey) { arrs.push(tmp[1]); } } if (arrs.length == 1){ return arrs[0]; }else if (arrs.length == 0){ return ""; }else{ return arrs; } } else//不指定参数名 { if (param ==undefined||param=="") return{};//返回空 else { var strs = param.split('&'); var arrObj = new Object(); var len = strs.length; for(var i=0;i<len;i++) { var tmp = strs[i].split('=');//tmp[0]是参数 if(!(tmp[0] in arrObj)) { arrObj[tmp[0]]=[]; } arrObj[tmp[0]].push(tmp[1]);//每个参数都有一个数组,里面存放着该参数的值 } return arrObj;//返回全部的参数对象 } } }
JS中split的用法:W3School的讲解