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 #...
    邵勝奧閱讀 4,894評論 0 1
  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,145評論 1 32
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,514評論 0 13
  • 走的那天 是周日 因為下雨 所以中午忙完回家送她上學 午飯還沒有吃 為了節省時間 B&M也在車上 一路上都是在談工...
    小禾小禾閱讀 768評論 0 1
  • 人就是個矛盾結合體 矛盾著別人 也矛盾著自己 看到老同學工作的順心與失意 感慨著別人 期望著自己 不要灰心 不要喪...
    安若心閱讀 213評論 0 1