将url的查询参数解析成字典对象

这个题目不约而同的出现在了多家公司的面试题中,当然也是因为太过于典型,解决方案无非就是拆字符或者用正则匹配来解决,我个人强烈建议用正则匹配,因为url允许用户随意输入,如果用拆字符的方式,有任何一处没有考虑到容错,就会导致整个js都报错。而正则就没有这个问题,他只匹配出正确的配对,非法的全部过滤掉,简单,方便。

实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function  getQueryObject(url) {
     url = url ==  null  ? window.location.href : url;
     var  search = url.substring(url.lastIndexOf( "?" ) + 1);
     var  obj = {};
     var  reg = /([^?&=]+)=([^?&=]*)/g;
     search.replace(reg,  function  (rs, $1, $2) {
         var  name = decodeURIComponent($1);
         var  val = decodeURIComponent($2);               
         val = String(val);
         obj[name] = val;
         return  rs;
     });
     return  obj;
}
 
getQueryObject( "http://www.cnblogs.com/leee/p/4456840.html?name=1&dd=ddd**" )
Object {name:  "1" , dd:  "ddd**" }

 

-----------------------------2016/11/10跟新------------------------------------

2,将对象转化成url参数。fetch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function  param(a) {
     var  s = [], rbracket = /\[\]$/,
         isArray =  function  (obj) {
             return  Object.prototype.toString.call(obj) ===  '[object Array]' ;
         }, add =  function  (k, v) {
             v =  typeof  v ===  'function'  ? v() : v ===  null  ''  : v === undefined ?  ''  : v;
             s[s.length] = encodeURIComponent(k) +  '='  + encodeURIComponent(v);
         }, buildParams =  function  (prefix, obj) {
             var  i, len, key;
 
             if  (prefix) {
                 if  (isArray(obj)) {
                     for  (i = 0, len = obj.length; i < len; i++) {
                         if  (rbracket.test(prefix)) {
                             add(prefix, obj[i]);
                         else  {
                             buildParams(prefix +  '['  + ( typeof  obj[i] ===  'object'  ? i :  '' ) +  ']' , obj[i]);
                         }
                     }
                 else  if  (obj && String(obj) ===  '[object Object]' ) {
                     for  (key  in  obj) {
                         buildParams(prefix +  '['  + key +  ']' , obj[key]);
                     }
                 else  {
                     add(prefix, obj);
                 }
             else  if  (isArray(obj)) {
                 for  (i = 0, len = obj.length; i < len; i++) {
                     add(obj[i].name, obj[i].value);
                 }
             else  {
                 for  (key  in  obj) {
                     buildParams(key, obj[key]);
                 }
             }
             return  s;
         };
 
     return  buildParams( '' , a).join( '&' ).replace(/%20/g,  '+' );
}

  

用到此方法  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值