Js中split()方法的正確使用


通過 js 獲取 QueryString (location.search部分) 參數很常見,網上代碼也滿天飛。
不過現在的框架,基本上都通過路由偽靜態了,把以前的 QueryString 變成了
pathname (location.pathname部分) 路徑參數了。

例如:/index.html?id=22&name=abc
很多框架都是渲染為 /index/id/22/name/abc.html

那么怎么獲取 pathname 級的參數呢?有人覺得改下 QueryString 代碼的正則即可。
雖然可以,但是比較麻煩,而且正則寫的不嚴謹,可能匹配不精確,導致有些參數匹配不到。

其實無論是 QueryString,pathname,用正則都不是最合理的,而應該采取 split 大法。
為什么這么說呢,我舉個例子,大家就會明白了。

例如 /index.html?id=22&name=abc&DEBUG
例如 /index/id/22/name/ab.cd?DEBUG

正則都很難處理這的情況,QueryString 到還好,pathname 的,就糾結的要死了。
這種情況,我們就應該祭出 split 大法來處理這些煩人的問題了。
由於 split 無論是否分割成功,都會返回數組,所以最合適處理這樣的問題。

 

 1 /**
 2  * 獲取 QueryString
 3  * @param  {string} [name] 參數名,可空
 4  * @param  {string} [search] search部分值,可空
 5  * @return {string|object} 值或整個對象
 6  */
 7 function getQueryString(name, search) {
 8     var url = search || location.search;
 9     var params = {};
10 
11     if (url.indexOf('?') != -1) {
12         var arr = url.substring(1).split('&'); // 分割參數
13         for(var i = 0, l = arr.length; i < l; i ++) { // 遍歷參數
14             var kv = arr[i].split('='); // 分隔鍵值對
15             params[kv.shift()] = kv.length ? decodeURIComponent(kv.join('=')) : undefined; // 如果有值就解碼存儲
16         }
17     }
18 
19     return name ? params[name] : params; // 輸出 name 的值或整個參數對象
20 }
21 
22 // 假設 search 值為 ?uid=KB1R+qyhl24II350DQ=&name=abc&DEBUG
23 console.log( getQueryString() ); // => {uid: "KB1R+qyhl24II350DQ=", name: "abc", DEBUG: undefined}
24 console.log( getQueryString('uid') ); // => KB1R+qyhl24II350DQ=
25 //
26 console.log( getQueryString('name', '?uid=KB1R+qyhl24II350DQ=&name=abc&DEBUG') ); // => abc
 1 /**
 2  * 獲取 pathname
 3  * @param  {string} [name] 參數名,可空
 4  * @param  {string} [path] pathname部分值,可空
 5  * @return {string|object} 值或整個對象
 6  */
 7 function getPathNmae(name, path) {
 8     var params = {};
 9     path = (path || location.pathname)
10         .split('.html')[0] // 獲取 .html 之前的部分
11         .split('/'); // 分隔目錄
12 
13     while (path.length) { // 從后遍歷數組
14         var val = path.pop(); // 得到值
15         var key = path.pop(); // 得到鍵
16 
17         if (key) {
18             params[key] = decodeURIComponent(val); // 解碼存儲
19         }
20     }
21 
22     return name ? params[name] : params; // 輸出name的值或整個參數對象
23 }
24 
25 // 假設 pathname 值為 /index/id/22/name/abc.html
26 console.log( getPathNmae() ); // {id: "22", name: "abc"}
27 console.log( getPathNmae('name') ); // abc
28 //
29 console.log( getPathNmae('name', '/index/id/22/name/abc.html') ); // abc

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM