queryString 分析器

在开发当中,我们经常要处理 url。而 url 上的 query string 是我们重点要处理的对象,完成一个 parseQueryString 函数。它接受一个 url 字符串作为参数,返回一个对象,这个对象包含 query string 上的键值对。例如:

parseQueryString('https://scriptoj.com/problems?offset=100&limit=10')
返回: 
{ offset: '100', limit: '10'}

特殊情况说明:
如果出现 ?name=&age=12 则返回 { name: '', age: '12' },
如果 ?name&age=12 则返回 { name: null, age: '12' }
如果 ?name=jerry#nice 则返回 { name: jerry }
如果 ?page=all?cur=10 则返回 { page:all?cur=10}

答案

这道题本身不难,但是由于基础不扎实还是踩到了坑,首先数组、对象的拷贝都是浅拷贝,只是拷贝了名称引用,一处修改,将造成所有引用的变化。例如下面,对last的删除动作将引起KV的变化!

 let KV=item.split('=') 
 let last=KV   // 错误,对象赋值为浅拷贝
 last.splice(0,1) // 删掉第一个值,splice的返回值为被删掉的值

必须使用 let last=[...KV] 或者 let last=KV.concat([]) ,就可以实现对数组的保存。
对象也是同理:let last={...KV} 或者 let last=JSON.parse(JSON.stringify(KV))
注意不要使用 let last=Object.assign({},KV) Object.assign只是对对象根属性进行了深拷贝,根属性中嵌套的子对象依旧是浅拷贝。

       const parseQueryString = (url)=>{
           let hashIdx=url.indexOf("#")
           if(hashIdx!=-1){
               url=url.substring(0,hashIdx)
           }
           let qIdx=url.indexOf("?")
           let r={}
           if(qIdx==-1){
               return r
           }else{
                url=url.substr(qIdx+1)
                url=url.split('&')
                url.forEach((item,idx)=>{
                    let KV=item.split('=')
                    if(KV.length>2){
                      let last=[...KV]
                      last.splice(0,1)
                      KV[1]=last.join('=')  
                    }
                    if(KV[1]===undefined){
                        r[KV[0]]=null
                    }else{
                        r[KV[0]]=KV[1]
                    }
                });
                return r
           }
       }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵胜奥阅读 10,337评论 0 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,798评论 1 32
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 13,145评论 0 13
  • 走的那天 是周日 因为下雨 所以中午忙完回家送她上学 午饭还没有吃 为了节省时间 B&M也在车上 一路上都是在谈工...
    小禾小禾阅读 4,101评论 0 1
  • 人就是个矛盾结合体 矛盾着别人 也矛盾着自己 看到老同学工作的顺心与失意 感慨着别人 期望着自己 不要灰心 不要丧...
    安若心阅读 1,423评论 0 1