Split query string in URL
Requirement: Pass in an sUrl string and return the key value of sKey. If there are multiple identical sKeys, store their key values in an array and return them. If no sKey is passed, an object is returned, and all query characters are stored in the object. String
For example: getUrlParam('http://www.baidu.com?key=1&key=2&key=3&key=4&test1=4#name', 'key')
returns: [1,2,3,4],
getUrlParam(' http://www.baidu.com?key=1&key=2&key=3&key=4&test1=4#name')
returns: {key:['1','2','3','4'],test1: ['4']}
function getUrlParam(sUrl, sKey) {
// 将url字符串用split方法分割成key=value&key=value的形式
let str = sUrl.split('?')[1].split('#')[0]
// 判断是否传了需要查询的指定参数sKey
if (sKey) {
// 传了sKey参数则返回指定参数的对应值
// 准备一个空数组用来存放每一对key=value,数组中的每个元素都是[key,value]的形式
let b = []
// 使用split方法把str字符串以&分隔开,遍历返回的数组中的每个元素,把每个元素都以=分隔开,然后存入b数组
str.split('&').forEach(item => {
const part = item.split('=')
b.push(part)
})
// 将b数组过滤出key值等于sKey的元素,item[0]就是值key=value中的key
let c = b.filter(item => item[0] === sKey)
if (c.length > 1) {
// 如果过滤后的数组长度大于1,则d为一个数组
// 遍历c数组将数组中每一项的第二个元素,也就是key=value的value值转化为数字存入到d数组中
let d = []
c.forEach(item => d.push(Number(item[1])))
// 返回的d数组就是要查询的参数的值的集合
return d
} else if(c.length===1){
// 如果过滤后的数组长度等于1,则就返回value值
let d
c.forEach(item => d = item[1])
return d
}else if(c.length===0){
// 数组长度为0则返回一个空字符串
return ''
}
}else{
// 如果没有传sKey参数则返回一个对象,对象中存所有key:value键值对
if(!str){
return {
}
}else{
let obj={
}
// 将str用split方法以&分隔开,遍历数组
str.split('&').forEach(item=>{
// 如果数组的每一项以=分隔开的第一项在obj对象中不存在,则第一项为对象的key,类型为一个数组
if(!(item.split('=')[0] in obj)){
obj[item.split('=')[0]]=[]
}
// 将第二项的值存入第一项key的数组中
obj[item.split('=')[0]].push(item.split('=')[1])
})
// 返回的对象就是所有查询字符串的集合
return obj
}
}
}