2010-11-18 123 views
2

有jQuery的的扩展,从一组则params的获得:jQuery的读取URL和存储来自哈希PARAMS的对象

categories[]=Shop+Mac&categories[]=Software&price_max=2799&price_min=24&sort=&page=1 

一个JSON对象,如:

{ 
    'categories': ["Shop Mac", "Software"], 
    'price_max': "2799", 
    'price_min': "24", 
    'page':   '1' 
} 

... ?

+0

重复:HTTP:/ /stackoverflow.com/questions/1131630/javascript-jquery-param-inverse-function – Mark 2010-11-18 17:02:15

回答

1

我有一个简单的解决方案:

// Get args from somewhere 
var args = 'categories[]=Shop+Mac&categories[]=Software&price_max=2799&price_min=24&sort=&page=1'; 

// Set up final object 
var output = {} 

// Split on & to get groups of key-value pairs 
args = args.split('&'); 

for (i = 0; i < args.length; i++) { 

    // Split on = to get separate key from value 
    args[i] = args[i].split('='); 

    // Remove square brackets from the key if they exist 
    if (/\[\]$/.test(args[i][0])) { 
     key = args[i][0].substring(0,(args[i][0].length) - 2); 
    } else { 
     key = args[i][0] 
    } 

    // If we haven't visited this key before then set it to a empty array 
    if (output[key] === undefined) { 
     output[key] = []; 
    } 

    // Push the value in to the array and remove + symbols whilst we're at it 
    output[key].push(args[i][1].replace('+', ' ')); 

} 

如果你使用Firefox,您可以:

// You can now use output 
console.debug(output); 

,你会得到:

categories: ["Shop Mac", "Software"] 
page: ["1"] 
price_max: ["2799"] 
price_min: ["24"] 
sort: [""] 
+0

请注意,此解决方案不解码结果(它只是co将'+'颠倒为空格)。 – 2010-11-20 16:07:12

+0

我不知道'+'符号的意义是什么,但我看到输出删除了它,所以我也做了。在这一点上修改此解决方案以做你想做的任何事情都很容易。 – OrganicPanda 2010-11-26 16:02:26

2

我在this answer中写了一个函数来帮助你。我投票结束这个问题作为这个问题的重复,但现在我看到在这个问题上有额外的要求。当我写这个问题的答案,我做了一个版本,将处理数组风格的URL参数太多:

(function() { 
    var e, 
     d = function (s) { return decodeURIComponent(s).replace(/\+/g, " "); }, 
     q = window.location.search.substring(1), 
     r = /([^&=]+)=?([^&]*)/g; 

    while (e = r.exec(q)) { 
     if (e[1].indexOf("[") == "-1") 
      urlParams[d(e[1])] = d(e[2]); 
     else { 
      var b1 = e[1].indexOf("["), 
       aN = e[1].slice(b1+1, e[1].indexOf("]", b1)), 
       pN = d(e[1].slice(0, b1)); 

      if (typeof urlParams[pN] != "object") 
       urlParams[d(pN)] = {}, 
       urlParams[d(pN)].length = 0; 

      if (aN) 
       urlParams[d(pN)][d(aN)] = d(e[2]); 
      else 
       Array.prototype.push.call(urlParams[d(pN)], d(e[2])); 

     } 
    } 
})(); 

你可以看到一个演示在这里工作:http://jsbin.com/adali3/2

样品查询字符串:

test=Hello&person[]=jeff&person[]=jim&person[extra]=john&nocache=1290122355841

结果:

{ 
    "test": "Hello", 
    "person": { 
     "0": "jeff", 
     "1": "jim", 
     "length": 2, 
     "extra": "john" 
    }, 
    "nocache": "1290100673882" 
}