A função inversa $ .param () em JavaScript / jQuery

122

Dado o seguinte formulário:

<form>
    <input name="foo" value="bar">
    <input name="hello" value="hello world">
</form>

Eu posso usar a $.param( .. )construção para serializar o formulário:

$.param( $('form input') )

=> foo=bar&hello=hello+world

Como posso desserializar a String acima com JavaScript e recuperar um hash?

Por exemplo,

$.magicFunction("foo=bar&hello=hello+world")

=> {'foo' : 'bar', 'hello' : 'hello world'}

Referência: jQuery.param( obj ).

seb
fonte
2
Estou adicionando este comentário para que você possa ver a atualização que fiz no código, caso esteja usando ... Eu o escrevi acidentalmente para substituir apenas o primeiro +. Agora ele substitui todos eles!
Blixt 15/07/2009
Existem plugins chamados QueryString. Eu criei um, mas ele não aceita parâmetros, apenas lê em window.location.search. Lembro-me de outros que aceitam parâmetros ...
BrunoLM
1
deparam refatorado jquery churrasco () Método como módulo NPM sem dependências npmjs.com/package/deparam
alexey2baranov
alexey2baranov que tal refatorar deparam () sem o NPM como dependência? :)
Andrew

Respostas:

62

Você deve usar jQuery churrasco 's deparam função. É bem testado e documentado.

cce
fonte
Nice plugin! Obrigado por compartilhar.
Jonathan
29
Se você não quiser obter todo o plug-in churrasco, a função deparam foi extraído como um autônomo plugin aqui: github.com/chrissrogers/jquery-deparam
Felipe Castro
2
Infelizmente, a página do github não vê nenhuma atualização há anos, e quando eu tentei, ela não parece compatível com o jQuery mais recente ... Parece o que eu preciso.
pilavdzice
31

Esta é uma versão ligeiramente modificada de uma função que escrevi há algum tempo para fazer algo semelhante.

var QueryStringToHash = function QueryStringToHash  (query) {
  var query_string = {};
  var vars = query.split("&");
  for (var i=0;i<vars.length;i++) {
    var pair = vars[i].split("=");
    pair[0] = decodeURIComponent(pair[0]);
    pair[1] = decodeURIComponent(pair[1]);
        // If first entry with this name
    if (typeof query_string[pair[0]] === "undefined") {
      query_string[pair[0]] = pair[1];
        // If second entry with this name
    } else if (typeof query_string[pair[0]] === "string") {
      var arr = [ query_string[pair[0]], pair[1] ];
      query_string[pair[0]] = arr;
        // If third or later entry with this name
    } else {
      query_string[pair[0]].push(pair[1]);
    }
  } 
  return query_string;
};
Quentin
fonte
1
Exatamente o que pensei com a resposta aceita "isso não funcionará com matrizes". Sua solução funciona bem.
Robert Koritnik 16/09/09
20

Que tal essa abordagem funcional curta?

function parseParams(str) {
    return str.split('&').reduce(function (params, param) {
        var paramSplit = param.split('=').map(function (value) {
            return decodeURIComponent(value.replace(/\+/g, ' '));
        });
        params[paramSplit[0]] = paramSplit[1];
        return params;
    }, {});
}

Exemplo:

parseParams("this=is&just=an&example") // Object {this: "is", just: "an", example: undefined}
Joel Richard
fonte
1
Essa deve ser a resposta aceita, sem dependências externas.
Michael Robinson
Solução simples, confiável e poderosa. Respeito, senhor.
Fmquaglia 17/07/2016
5
Para o que faz, é certamente uma boa solução. Mas ele não cuida de matrizes ou objetos sendo passados. O URL field[][]=a&field[0][]=b&field[0][]=cé processado como Object { field[][]: "a", field[0][]: "c" }deveria estar resultobject.field[0] = Array [ "a", "b", "c" ]. Esse é o comportamento conforme o esperado do PHP. A solução da @ JackyLi cuida disso.
cars10m
16

Minha resposta:

function(query){
  var setValue = function(root, path, value){
    if(path.length > 1){
      var dir = path.shift();
      if( typeof root[dir] == 'undefined' ){
        root[dir] = path[0] == '' ? [] : {};
      }

      arguments.callee(root[dir], path, value);
    }else{
      if( root instanceof Array ){
        root.push(value);
      }else{
        root[path] = value;
      }
    }
  };
  var nvp = query.split('&');
  var data = {};
  for( var i = 0 ; i < nvp.length ; i++ ){
    var pair = nvp[i].split('=');
    var name = decodeURIComponent(pair[0]);
    var value = decodeURIComponent(pair[1]);

    var path = name.match(/(^[^\[]+)(\[.*\]$)?/);
    var first = path[1];
    if(path[2]){
      //case of 'array[level1]' || 'array[level1][level2]'
      path = path[2].match(/(?=\[(.*)\]$)/)[1].split('][')
    }else{
      //case of 'name'
      path = [];
    }
    path.unshift(first);

    setValue(data, path, value);
  }
  return data;
}
Jacky Li
fonte
Sim! Sim! Sim! Este é exatamente o que eu preciso para analisar os parâmetros que estão sendo enviados pelo JQuery em uma chamada $ .ajax. Isso retorna os hashes aninhados corretamente. Muito obrigado, Jacky Li!
Pascal Lindelauf
A melhor solução até agora - se comporta muito bem! Mas quando eu uso JSON.stringify(geturlargs('fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc').fld)eu recebo {"2":["2"],"3":["4"],"":"cc"}e não o [null,null,[2],[3,4],"bb","cc"]que eu esperava (isso é o que o PHP me daria).
cars10m
1
Esta é a resposta correta e ignore todos os outros anwers, eles não funcionam corretamente
Andrew
1
Esta resposta é a única que abordou meu caso de uso específico (onde eu passei um objeto com valores / chave aninhados para $ .param do jQuery, isso hidrata adequadamente esses valores após a recuperação).
Delinear
9

Estou usando a resposta de David Dorward e percebi que ela não se comporta como PHP ou Ruby on Rails como eles analisam os parâmetros:

1) uma variável é apenas uma matriz se terminar com [], como ?choice[]=1&choice[]=12, não quando estiver?a=1&a=2

2) quando existem vários parâmetros com o mesmo nome, os últimos substituem os anteriores, como nos servidores PHP (o Ruby on Rails mantém o primeiro e ignora os últimos), como ?a=1&b=2&a=3

Então, modificando a versão de David, tenho:

function QueryStringToHash(query) {

  if (query == '') return null;

  var hash = {};

  var vars = query.split("&");

  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    var k = decodeURIComponent(pair[0]);
    var v = decodeURIComponent(pair[1]);

    // If it is the first entry with this name
    if (typeof hash[k] === "undefined") {

      if (k.substr(k.length-2) != '[]')  // not end with []. cannot use negative index as IE doesn't understand it
        hash[k] = v;
      else
        hash[k.substr(0, k.length-2)] = [v];

    // If subsequent entry with this name and not array
    } else if (typeof hash[k] === "string") {
      hash[k] = v;  // replace it

    // If subsequent entry with this name and is array
    } else {
      hash[k.substr(0, k.length-2)].push(v);
    }
  } 
  return hash;
};

que é testado com bastante cuidado.

falta de polaridade
fonte
A especificação da uri é que? A = 1 & a = 2 deve ser uma matriz. Ruby on Rails e PHP não seguem a especificação real.
Adiktofsugar 26/02
A linha onde você acrescentar à matriz deve ser hash[k.substr(0, k.length-2)] = [v];ehash[k.substr(0, k.length-2)].push(v);
Baptiste Pernet
Seria bom se isso poderia ser disponibilizado através npm
Erik van Velzen
7

Eu sei que esse é um tópico antigo, mas talvez ainda haja alguma relevância nele?

Inspirado pela boa solução de Jacky Li, tentei uma pequena variação, com o objetivo de também poder cuidar de combinações arbitrárias de matrizes e objetos como entrada. Eu olhei como o PHP teria feito isso e tentei obter algo "semelhante". Aqui está o meu código:

function getargs(str){
   var ret={};
   function build(urlnam,urlval,obj){ // extend the return object ...
    var i,k,o=obj, x, rx=/\[([^\]]*)\]/g, idx=[urlnam.replace(rx,'')];
    while (x=rx.exec(urlnam)) idx.push(x[1]); 
    while(true){
     k=idx.shift();
     if(k.trim()=='') {// key is empty: autoincremented index
       if (o.constructor.name=='Array') k=o.length; // for Array
       else if (o===obj ) {k=null}  // for first level property name
       else {k=-1;                                  // for Object
         for(i in o) if (+i>k) k=+i;
         k++;
       }
     }
     if(idx.length) { 
       // set up an array if the next key (idx[0]) appears to be
       // numeric or empty, otherwise set up an object:
       if (o[k]==null || typeof o[k]!='object') o[k]=isNaN(idx[0])?{}:[]; 
       o=o[k]; // move on to the next level
     }
     else { // OK, time to store the urlval in its chosen place ...
       // console.log('key',k,'val',urlval);                 
       o[k]=urlval===""?null:urlval; break; // ... and leave the while loop.
     } 
    }
    return obj;
   }
   // ncnvt: is a flag that governs the conversion of
   // numeric strings into numbers
   var ncnvt=true,i,k,p,v,argarr=[],
       ar=(str||window.location.search.substring(1)).split("&"),
       l=ar.length;
   for (i=0;i<l;i++) {if (ar[i]==="") continue;
     p=ar[i].split("=");k=decodeURIComponent(p[0]);
     v=p[1];v=(v!=null)?decodeURIComponent(v.replace(/\+/g,'%20')):'';
     if (ncnvt && v.trim()>"" && !isNaN(v)) v-=0;
     argarr.push([k,v]);  // array: key-value-pairs of all arguments
   }
   for (i=0,l=argarr.length;i<l;i++) build(argarr[i][0],argarr[i][1],ret);
   return ret;
}

Se a função for chamada sem o strargumento-assumirá window.location.search.slice(1)como entrada.

Alguns exemplos:

['a=1&a=2',                               // 1
 'x[y][0][z][]=1',                        // 2
 'hello=[%22world%22]&world=hello',       // 3
 'a=1&a=2&&b&c=3&d=&=e&',                 // 4
 'fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc',  // 5
 $.param({a:[[1,2],[3,4],{aa:'one',bb:'two'},[5,6]]}), // 6
 'a[]=hi&a[]=2&a[3][]=7&a[3][]=99&a[]=13',// 7
 'a[x]=hi&a[]=2&a[3][]=7&a[3][]=99&a[]=13'// 8
].map(function(v){return JSON.stringify(getargs(v));}).join('\n')

resulta em

{"a":2}                                    // 1
{"x":{"y":[{"z":[1]}]}}                    // 2
{"hello":"[\"world\"]","world":"hello"}    // 3
{"a":2,"b":null,"c":3,"d":null,"null":"e"} // 4 = { a: 2, b: null, c: 3, d: null, null: "e" }
{"fld":[null,null,[2],[3,4],"bb","cc"]}    // 5 
{"a":[[1,2],[3,4],{"aa":"one","bb":"two"},[5,6]]}  // 6
{"a":["hi",2,null,[7,99],13]}              // 7
{"a":{"0":2,"3":[7,99],"4":13,"x":"hi"}}   // 8

Considerando que a solução de Jacky Li produziria o recipiente externo acomo um objeto simples

{a:{"0":["1","2"],"1":["3","4"],"2":["5","6"]}} // 6: JackyLi's output

getargs() examina o primeiro índice fornecido em busca de qualquer nível para determinar se esse nível será um objeto (índice não numérico) ou uma matriz (numérica ou vazia), resultando assim na saída conforme mostrado na lista acima (nº 6).

Se o objeto atual for uma matriz, nulls serão inseridos sempre que necessário para representar posições vazias. As matrizes são sempre numeradas consecutivamente e com base em 0).

Note que no exemplo não. 8 o "incremento automático" para índices vazios ainda funciona, embora estejamos lidando com um objeto agora e não com uma matriz.

Tanto quanto eu testei, meu getargs()comportamento se comporta de maneira idêntica ao ótimo $.deparam() plugin jQuery de Chriss Roger mencionado na resposta aceita. A principal diferença é que getargsé executada sem jQuery e que faz autoincrement em objetos enquanto $.deparam()vai não fazer isso:

JSON.stringify($.deparam('a[x]=hi&a[]=2&a[3][]=7&a[3][]=99&a[]=13').a);

resulta em

{"3":["7","99"],"x":"hi","undefined":"13"}

No $.deparam()índice []é interpretado como um undefinedíndice numérico autoincrementado.

cars10m
fonte
obrigado por esta grande função. No entanto, notei que se você usar o número como chave na matriz, por exemplo, como '? A [5] [] = x', a chave será usada como número ao criar um objeto e, portanto, criará 5 elementos vazios no meu caso. Ele deve tratar a chave numérica como string e, assim, criar um objeto com "5" (entre aspas) como chave e x como valor. Eu poderia forçar o url a ser '? A ["5"] [] = x', mas isso é feio ... #
301 Andrew Andrew
@ Andrew: Esta foi uma decisão deliberada de design da minha parte: Tanto quanto me lembro, a solução de Jack se comportará mais da maneira que você espera. Eu introduzi a linha o[k]=isNaN(idx[0])?{}:[];com a intenção de criar uma matriz, sempre que encontro um índice numérico como o primeiro dado para um novo objeto. Caso contrário, farei um objeto genérico. Cabe a você modificar essa parte do código para melhor atender às suas necessidades. I. e. algo como o[k]={}deve fazer o truque.
cars10m
obrigado. PS você deve definitivamente remover console.log no meio de sua função;)
Andrew
@ Andrew: Obrigado, apenas comentei. Deve ter esquecido quando publiquei o código.
cars10m
6

Veja como você pode criar uma nova função jQuery:

jQuery.unparam = function (value) {
    var
    // Object that holds names => values.
    params = {},
    // Get query string pieces (separated by &)
    pieces = value.split('&'),
    // Temporary variables used in loop.
    pair, i, l;

    // Loop through query string pieces and assign params.
    for (i = 0, l = pieces.length; i < l; i++) {
        pair = pieces[i].split('=', 2);
        // Repeated parameters with the same name are overwritten. Parameters
        // with no value get set to boolean true.
        params[decodeURIComponent(pair[0])] = (pair.length == 2 ?
            decodeURIComponent(pair[1].replace(/\+/g, ' ')) : true);
    }

    return params;
};
Blixt
fonte
4
Eu não gosto dessa função. Por que parâmetro sem valor deve obter o valor de 'true'? Por que não nulo? Eu acho que essa decisão de design pode levar a erros muito sutis. Além disso, por que não lidar com a situação em que o parâmetro pode ter vários valores em vez de selecionar o valor 'last'? A solução postada por David é muito melhor.
SolutionYogi
4
É truepara que se possa verificar if (params.redirect)ou similar. Se você quiser diferir entre truee outro valor, você usaria if (params.redirect === true). Um nullvalor não ajudaria de nenhuma maneira que eu possa pensar. O motivo pelo qual não fiz como David é porque valorizo ​​a consistência sobre a flexibilidade. Com seu método, tenho que verificar se o valor é uma string ou uma matriz para usar seu valor. Na minha opinião, deve sempre ser uma string (o truevalor é convertido para o 'true'que eu acho bom) ou sempre ser uma matriz. Eu escolhi corda.
Blixt 15/07/2009
Por essa conta, se fosse params.delete, seria definido como true e farei algo prejudicial. Como você pode ver, é fácil criar um exemplo. 'null' especifica claramente que não existe valor e a decisão é deixada para o chamador como ele deseja interpretá-lo. Sobre vários valores, olhe dessa maneira. Ao comer, você está certificando-se de que qualquer chamador gaste tempo depurando por que ele está recebendo apenas um valor OU mais tarde virá e modificará o código. Ao retornar a matriz antecipadamente, o chamador saberá imediatamente como lidar com eles. Descartar informações nunca é bom, IMHO.
SolutionYogi
2
Se o URL for /abc?delete, eu esperaria que houvesse uma entrada para delete. Não vejo como isso é diferente? Eu nem vejo como você pode preferir o outro código por esse motivo, porque esse código definirá o valor para a string 'undefined'que não é melhor. E, quanto a vários valores, é um caso de simplicidade versus flexibilidade. Raramente vejo o uso de vários valores nas cadeias de consulta, mas se você os quiser, sempre retorne uma matriz com 1 ou mais valores. Nunca misture o tipo de retorno; então você terá que gastar tempo para depurar, porque o que geralmente era uma cadeia de repente poderia ser uma matriz.
Blixt 16/07/2009
Obrigado. Eu não acho que haja uma bala de prata. Peguei o seu código e o modifiquei um pouco, removi os valores booleanos, adicionei a análise dos parâmetros da matriz. ? foo [] = 1 & foo [] = 2 => foo: ["1", "2"]]
seb
6

Graças a ele http://james.padolsey.com/javascript/parsing-urls-with-the-dom/

Muito fácil: D

function params_unserialize(p){
var ret = {},
    seg = p.replace(/^\?/,'').split('&'),
    len = seg.length, i = 0, s;
for (;i<len;i++) {
    if (!seg[i]) { continue; }
    s = seg[i].split('=');
    ret[s[0]] = s[1];
}
return ret;}
brutuscat
fonte
2
Isso não funciona com caixas de seleção com várias opções, porque apenas mantém a última seleção.
Fernando Fabreti
Desculpe, mas não consigo ver qual é o ponto a que você está se referindo no comentário. A função mencionada aqui é desserializar / analisar um URI com parâmetros como ?something=1&param2=value2em uma matriz. O que você quer dizer com "não funciona com caixas de seleção com várias opções"?
Brutuscat 17/08/2012
4

Aqui está minha implementação JavaScript que eu uso em uma página JScript ASP Classic do lado do servidor ( demo ):

// Transforms a query string in the form x[y][0][z][]=1 into {x:{y:[{z:[1]}]}}
function parseJQueryParams(p) {
    var params = {};
    var pairs = p.split('&');
    for (var i=0; i<pairs.length; i++) {
        var pair = pairs[i].split('=');
        var indices = [];
        var name = decodeURIComponent(pair[0]),
            value = decodeURIComponent(pair[1]);

        var name = name.replace(/\[([^\]]*)\]/g, 
            function(k, idx) { indices.push(idx); return ""; });

        indices.unshift(name);
        var o = params;

        for (var j=0; j<indices.length-1; j++) {
            var idx = indices[j];
            var nextIdx = indices[j+1];
            if (!o[idx]) {
                if ((nextIdx == "") || (/^[0-9]+$/.test(nextIdx)))
                    o[idx] = [];
                else
                    o[idx] = {};
            }
            o = o[idx];
        }

        idx = indices[indices.length-1];
        if (idx == "") {
            o.push(value);
        }
        else {
            o[idx] = value;
        }
    }
    return params;
}
Yuval
fonte
Até agora o melhor que encontrei para matrizes aninhadas
ymakux
3

usa isto :

// convert query string to json object
var queryString = "cat=3&sort=1&page=1";

queryString
    .split("&")
    .forEach((item) => {
        const prop = item.split("=");
        filter[prop[0]] = prop[1];
    });

console.log(queryString);
Mohmmad Ebrahimi Aval
fonte
1

Eu vim com esta solução, que se comporta como a função .Net HttpUtility.ParseQueryString.

No resultado, os parâmetros da string de consulta são armazenados em propriedades como listas de valores, de modo que qsObj["param"]serão os mesmos que chamar GetValues("param").Net.

Espero que você goste. JQuery não é necessário.

var parseQueryString = function (querystring) {
    var qsObj = new Object();
    if (querystring) {
        var parts = querystring.replace(/\?/, "").split("&");
        var up = function (k, v) {
            var a = qsObj[k];
            if (typeof a == "undefined") {
                qsObj[k] = [v];
            }
            else if (a instanceof Array) {
                a.push(v);
            }
        };
        for (var i in parts) {
            var part = parts[i];
            var kv = part.split('=');
            if (kv.length == 1) {
                var v = decodeURIComponent(kv[0] || "");
                up(null, v);
            }
            else if (kv.length > 1) {
                var k = decodeURIComponent(kv[0] || "");
                var v = decodeURIComponent(kv[1] || "");
                up(k, v);
            }
        }
    }
    return qsObj;
};

Aqui está como usá-lo:

var qsObj = parseQueryString("a=1&a=2&&b&c=3&d=&=e&");

Para visualizar o resultado no console, basta digitar:

JSON.stringify(qsObj)

Resultado:

"{"a":["1","2"],"null":["","b",""],"c":["3"],"d":[""],"":["e"]}"

fonte
1

Há um belo artigo em CSS-Tricks (fonte original de Nicholas Ortenzio ):

function getQueryParameters(str) {
    return (str || document.location.search).replace(/(^\?)/,'').split("&").map(function(n){return n = n.split("="),this[n[0]] = n[1],this}.bind({}))[0];
}

A parte realmente inteligente é como ela usa o thisobjeto da função anônima , adicionando um par de chave / valor para cada uma das consultas na string. Dito isto, há algum espaço para melhorias. Eu o modifiquei um pouco abaixo, com as seguintes alterações:

  1. Adicionado tratamento de cadeias vazias e entrada sem cadeia.

  2. Manipulou cadeias codificadas em URI ( %40-> @, etc).

  3. Removido o uso padrão de document.location.searchquando a entrada estava vazia.

  4. Alterou o nome, tornou-o mais legível, acrescentou comentários.

function deparam(str) {
    // Uses an empty 'this' to build up the results internally
    function splitQuery(query) {
        query = query.split('=').map(decodeURIComponent);
        this[query[0]] = query[1];
        return this;
    }

    // Catch bad input
    if (!str || !(typeof str === 'string' || str instanceof String))
        return {};

    // Split the string, run splitQuery on each piece, and return 'this'
    var queries = str.replace(/(^\?)/,'').split('&');
    return queries.map(splitQuery.bind({}))[0];
}
Erik Koopmans
fonte
1

Esta é realmente uma pergunta antiga, mas como eu vim - outras pessoas podem vir a este post, e eu quero atualizar um pouco esse tema. Hoje não há necessidade de criar soluções personalizadas - existe a interface URLSearchParams .

var paramsString = "q=URLUtils.searchParams&topic=api";
var searchParams = new URLSearchParams(paramsString);

//Iterate the search parameters.
for (let p of searchParams) {
  console.log(p);
}

A única limitação que eu conheço - esse recurso não é suportado no IE / Edge.

Igor Benikov
fonte
Infelizmente, não há suporte do IE, como de costume, caso você precise oferecer suporte a este navegador.
Lauren
0

Esta é a minha versão no Coffeescript. Também funciona para URL como http://localhost:4567/index.html?hello=[%22world%22]&world=hello#/home

getQueryString: (url)->
    return null if typeof url isnt 'string' or url.indexOf("http") is -1

    split = url.split "?"

    return null if split.length < 2 
    path = split[1]

    hash_pos = path.indexOf "#"
    path = path[0...hash_pos] if hash_pos isnt -1

    data = path.split "&"
    ret = {}
    for d in data
      [name, val] = d.split "=" 
      name = decodeURIComponent name
      val = decodeURIComponent val
      try 
        ret[name] = JSON.parse val
      catch error
        ret[name] = val
    return ret
coderek
fonte
0

Aqui está um exemplo simples e compacto, se você deseja obter rapidamente os parâmetros de uma solicitação GET:

function httpGet() {
    var a={},b,i,q=location.search.replace(/^\?/,"").split(/\&/);
    for(i in q) if(q[i]) {b=q[i].split("=");if(b[0]) a[b[0]]=
    decodeURIComponent(b[1]).replace(/\+/g," ");} return a;
}

Converte

something?aa=1&bb=2&cc=3

em um objeto como

{aa:1,bb:2,cc:3}
dkellner
fonte
0

Cria uma representação serializada de uma matriz ou objeto (pode ser usada como string de consulta de URL para solicitações AJAX).

<button id='param'>GET</button> 
<div id="show"></div>
<script>
  $('#param').click(function () {
    var personObj = new Object();
    personObj.firstname = "vishal"
    personObj.lastname = "pambhar";
    document.getElementById('show').innerHTML=$.param(`personObj`));
  });
</script>
output:firstname=vishal&lastname=pambhar
Vishal Patel
fonte
1
Código sem explicações não é bem-vindo. Poderia ser por favor, vá em frente e explique seu código?
L. Guthardt 26/06
Cria uma representação de serialize de uma matriz ou objeto (pode ser usado como cadeia de consulta URL para solicitações de AJAX)
Vishal Patel
Adicione explicações diretamente na sua resposta, editando-a. Não nos comentários.
L. Guthardt 26/06
-1

As respostas podem usar um pouco de elegância do jQuery :

(function($) {
var re = /([^&=]+)=?([^&]*)/g;
var decodeRE = /\+/g; // Regex for replacing addition symbol with a space
var decode = function (str) {return decodeURIComponent( str.replace(decodeRE, " ") );};
$.parseParams = function(query) {
    var params = {}, e;
    while ( e = re.exec(query) ) {
        var k = decode( e[1] ), v = decode( e[2] );
        if (k.substring(k.length - 2) === '[]') {
            k = k.substring(0, k.length - 2);
            (params[k] || (params[k] = [])).push(v);
        }
        else params[k] = v;
    }
    return params;
};
})(jQuery);

fork em https://gist.github.com/956897

kares
fonte
-1

Você pode usar a função .serializeArray()( Link ) do próprio jQuery. Esta função retorna uma matriz de par de valores-chave. Exemplo de resultado:

[
  { name: "id", value: "1" },
  { name: "version", value: "100" }
]
Jefferson Henrique C. Soares
fonte
1
Não foi isso que foi perguntado. Ele quer transformar uma corda em um hash. serializeArray assume um formulário e retorna uma matriz.
Daniel bang