分割URL中的查询字符串

分割URL中的查询字符串

要求:传入一个sUrl字符串,返回sKey的键值,如果有多个相同的sKey,则将他们的键值存入数组并返回,如果没有传sKey则返回一个对象,对象中存所有查询字符串
例如:getUrlParam(‘http://www.baidu.com?key=1&key=2&key=3&key=4&test1=4#name’,‘key’)
返回:[1,2,3,4],
getUrlParam(‘http://www.baidu.com?key=1&key=2&key=3&key=4&test1=4#name’)
返回:{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
                }
            }
        }
posted @   东方初白  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示