La función inversa $ .param () en JavaScript / jQuery

122

Dada la siguiente forma:

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

Puedo usar la $.param( .. )construcción para serializar el formulario:

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

=> foo=bar&hello=hello+world

¿Cómo puedo deserializar la cadena anterior con JavaScript y recuperar un hash?

Por ejemplo,

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

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

Referencia: jQuery.param( obj ).

seb
fuente
2
Oye, solo estoy agregando este comentario para que puedas ver la actualización que hice al código, en caso de que lo estés usando ... accidentalmente lo escribí para que solo reemplazara el primero +. ¡Ahora los reemplaza a todos!
Blixt
Hay complementos llamados QueryString. Hice uno pero no acepta parámetros, solo se lee desde window.location.search. Recuerdo a otros que aceptan parámetros ...
BrunoLM
1
método refactorizado de jquery BBQ deparam () como módulo NPM sin dependencias npmjs.com/package/deparam
alexey2baranov
alexey2baranov ¿qué tal refactorizar deparam () sin NPM como dependencia? :)
Andrew

Respuestas:

62

Debe usar la función deparam de jQuery BBQ . Está bien probado y documentado.

cce
fuente
Bonito complemento! Gracias por compartir.
Jonathan
29
Si no desea obtener todo el complemento BBQ, la función deparam se extrajo como un complemento independiente aquí: github.com/chrissrogers/jquery-deparam
Felipe Castro
2
Desafortunadamente, la página de github no ha visto ninguna actualización en años, y cuando lo probé no parece compatible con la última jQuery ... Parece lo que necesito.
pilavdzice
31

Esta es una versión ligeramente modificada de una función que escribí hace un tiempo para hacer algo similar.

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
fuente
1
Exactamente lo que pensé con la respuesta aceptada "esto no funcionará con matrices". Su solución funciona bien.
Robert Koritnik
20

¿Qué tal este breve enfoque funcional?

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;
    }, {});
}

Ejemplo:

parseParams("this=is&just=an&example") // Object {this: "is", just: "an", example: undefined}
Joel Richard
fuente
1
Esta debería ser la respuesta aceptada, sin dependencias externas.
Michael Robinson el
Solución simple, confiable y potente. Respeto, señor.
fmquaglia
55
Por lo que hace, sin duda es una buena solución. Pero no se ocupa de las matrices u objetos que se pasan. La url field[][]=a&field[0][]=b&field[0][]=cse procesa como Object { field[][]: "a", field[0][]: "c" }donde debería estar resultobject.field[0] = Array [ "a", "b", "c" ]. Este es el comportamiento esperado de PHP. La solución de @ JackyLi se encarga de eso.
cars10m
16

Mi respuesta:

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
fuente
¡Si! ¡Si! ¡Si! Este es exactamente el que necesito para analizar los parámetros que envía JQuery en una llamada $ .ajax. Esto devuelve los hashes correctamente anidados. Muchas gracias, Jacky Li!
Pascal Lindelauf 05 de
La mejor solución hasta ahora: ¡se comporta bastante bien! Pero cuando uso JSON.stringify(geturlargs('fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc').fld)obtengo {"2":["2"],"3":["4"],"":"cc"}y no [null,null,[2],[3,4],"bb","cc"]lo que hubiera esperado (esto es lo que PHP me daría).
cars10m
1
Esta es LA respuesta correcta e ignore todas las otras respuestas, no funcionan correctamente
Andrew
1
Esta respuesta es la única que abordó mi caso de uso particular (donde pasé un objeto con clave / valores anidados a $ .param de jQuery, esto hidrata adecuadamente esos valores al recuperarlos).
delineado
9

Estoy usando la respuesta de David Dorward, y me di cuenta de que no se comporta como PHP o Ruby on Rails cómo analizan los parámetros:

1) una variable es solo una matriz si termina con [], por ejemplo ?choice[]=1&choice[]=12, no cuando es?a=1&a=2

2) cuando existen múltiples parámetros con el mismo nombre, los posteriores reemplazan a los anteriores, como en los servidores PHP (Ruby on Rails mantiene el primero e ignora los posteriores), como ?a=1&b=2&a=3

Modificando la versión de David, tengo:

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 se prueba bastante a fondo.

nonopolaridad
fuente
La especificación de uri es que? A = 1 & a = 2 debería ser una matriz. Ruby on Rails y PHP no siguen la especificación real.
adiktofsugar
La línea donde se agrega a la matriz debe ser hash[k.substr(0, k.length-2)] = [v];yhash[k.substr(0, k.length-2)].push(v);
Baptiste Pernet
Sería bueno si esto pudiera estar disponible a través de npm
Erik van Velzen
7

Sé que este es un hilo viejo, pero ¿tal vez todavía tenga alguna relevancia?

Inspirado por la buena solución de Jacky Li, probé una ligera variación propia con el objetivo de ser capaz de manejar combinaciones arbitrarias de matrices y objetos como entrada. Miré cómo PHP lo habría hecho y traté de lograr algo "similar". Aquí está mi 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;
}

Si se llama a la función sin el strargumento-asumirá window.location.search.slice(1)como entrada.

Algunos ejemplos:

['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')

resultados en

{"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

Mientras que la solución de Jacky Li produciría el contenedor externo acomo un objeto simple

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

getargs() mira el primer índice dado para cualquier nivel para determinar si este nivel será un objeto (índice no numérico) o una matriz (numérica o vacía), lo que da como resultado la salida como se muestra en el listado anterior (no. 6).

Si el objeto actual es una matriz, entonces nulls se inserta donde sea necesario para representar posiciones vacías. Las matrices siempre están numeradas consecutivamente y basadas en 0).

Tenga en cuenta que en el ejemplo no. 8 el "autoincremento" para índices vacíos todavía funciona, aunque ahora estemos tratando con un objeto y no con una matriz.

Hasta donde lo he probado, mi getargs()comportamiento se comporta de manera casi idéntica al gran $.deparam() complemento jQuery de Chriss Roger mencionado en la respuesta aceptada. La principal diferencia es que se getargsejecuta sin jQuery y que aumenta automáticamente en los objetos, mientras $.deparam()que no lo hará:

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

resultados en

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

En $.deparam()el índice []se interpreta como un undefinedíndice numérico autoincrementado en lugar de uno.

coches10m
fuente
Gracias por esta gran función. Sin embargo, noté que si usa el número como clave en la matriz, por ejemplo, como '? A [5] [] = x', entonces la clave se usa como número al crear un objeto y, por lo tanto, crea 5 elementos vacíos en mi caso. Debe tratar la clave numérica como una cadena y, por lo tanto, crear un objeto con "5" (con comillas) como clave yx como valor. Podría forzar url a ser '? A ["5"] [] = x' pero esto es feo ...
Andrew
@Andrew: Esta fue una decisión de diseño deliberada de mi parte: por lo que recuerdo, la solución de Jack se comportará más de la forma en que lo espera. Introduje la línea o[k]=isNaN(idx[0])?{}:[];con la intención de crear una matriz, cada vez que encuentro un índice numérico como el primero dado para un nuevo objeto. De lo contrario, haré un objeto genérico. Depende de usted modificar esa parte del código para que se adapte mejor a sus necesidades. I. e. algo así o[k]={}debería hacer el truco.
cars10m
Gracias. PD: definitivamente debe eliminar console.log en el medio de su función;)
Andrew
@ Andrew: Gracias, solo lo comenté. Debe haberlo pasado por alto cuando publiqué el código.
cars10m
6

Aquí le mostramos cómo podría crear una nueva función 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
fuente
44
No me gusta esta función. ¿Por qué el parámetro sin valor debería obtener el valor de 'verdadero'? ¿Por qué no nulo? Creo que esta decisión de diseño puede conducir a errores muy sutiles. Además, ¿por qué no manejar la situación en la que el parámetro puede tener múltiples valores en lugar de seleccionar el 'último' valor? La solución publicada por David es mucho mejor.
SoluciónYogi
44
Es truepara que uno pueda comprobar if (params.redirect)o similar. Si desea diferenciar entre truey otro valor, lo usaría if (params.redirect === true). Un nullvalor no ayudaría de ninguna manera que se me ocurra. La razón por la que no lo hice como David es porque valoro la consistencia sobre la flexibilidad. Con su método, tengo que verificar si el valor es una cadena o una matriz para usar su valor. En mi opinión, siempre debe ser una cadena (el truevalor se convierte en 'true'lo que creo que está bien), o siempre debe ser una matriz. Elegí la cuerda.
Blixt
Según esa cuenta, si fuera params.delete, se establecería en verdadero y haré algo dañino. Como puede ver, encontrar un ejemplo es fácil. 'nulo' especifica claramente que no existe ningún valor y la persona que llama decide cómo interpretarla. Acerca de los valores múltiples, míralo de esta manera. Al comer, se está asegurando de que cualquiera de las personas que llaman pasará tiempo depurando por qué solo obtiene un valor O más adelante, y luego modificará el código. Al devolver la matriz por adelantado, quien llama inmediatamente sabrá cómo manejarlos. Descartar información nunca es bueno, en mi humilde opinión.
SoluciónYogi
2
Si la URL es /abc?deleteentonces, esperaría que haya una entrada para delete. No veo cómo eso es diferente? Ni siquiera veo cómo puede preferir el otro código por este motivo, porque ese código establecerá el valor de la cadena 'undefined'que no es mejor. Y en cuanto a los valores múltiples, es un caso de simplicidad versus flexibilidad. Raramente veo el uso de múltiples valores en las cadenas de consulta, pero si los desea, siempre devuelva una matriz con valores 1+. Nunca mezcle el tipo de retorno; entonces tendrá que pasar tiempo para depurar porque lo que generalmente era una cadena de repente podría ser una matriz.
Blixt
Gracias. No creo que haya una bala de plata. Tomé su código y lo modifiqué un poco, eliminé los valores booleanos, agregué el análisis de los parámetros de la matriz. ? foo [] = 1 & foo [] = 2 => foo: ["1", "2"]
seb
6

Gracias a él http://james.padolsey.com/javascript/parsing-urls-with-the-dom/

Bastante 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
fuente
2
Esto no funciona con cuadros de selección con múltiples opciones, ya que solo se mantiene seleccionado por última vez.
Fernando Fabreti
Lo siento, pero no puedo ver cuál es el punto al que te refieres en el comentario. La función a la que se hace referencia aquí es deserializar / analizar un URI con parámetros como ?something=1&param2=value2en una matriz. ¿Qué quiere decir con "no funciona con cuadros de selección con múltiples opciones"?
brutuscat
4

Aquí está mi implementación de JavaScript que utilizo en una página JScript ASP Classic del lado del 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
fuente
Hasta ahora, el mejor que encontré para matrices anidadas
ymakux
3

utilizar este :

// 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
fuente
1

Se me ocurrió esta solución, que se comporta como la función .Net HttpUtility.ParseQueryString.

En el resultado, los parámetros de la cadena de consulta se almacenan en propiedades como listas de valores, por lo que qsObj["param"]será lo mismo que llamar GetValues("param")a .Net.

Espero que te guste. No se requiere JQuery.

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;
};

Aquí está cómo usarlo:

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

Para obtener una vista previa del resultado en la consola, escriba:

JSON.stringify(qsObj)

Salida:

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

fuente
1

Hay una hermosa línea en CSS-Tricks (fuente 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];
}

La parte realmente inteligente es cómo usa el thisobjeto de la función anónima , agregando un par clave / valor para cada una de las consultas en la cadena. Dicho esto, hay margen de mejora. Lo he modificado un poco a continuación, con los siguientes cambios:

  1. Se agregó manejo de cadenas vacías y entrada sin cadenas.

  2. Se manejaron cadenas codificadas por URI ( %40-> @, etc.).

  3. Se eliminó el uso predeterminado de document.location.searchcuando la entrada estaba vacía.

  4. Cambió el nombre, lo hizo más legible, agregó comentarios.

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
fuente
1

Esta es una pregunta muy antigua, pero como he venido, otras personas pueden venir a esta publicación, y quiero actualizar un poco este tema. Hoy no es necesario crear soluciones personalizadas: hay una interfaz 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);
}

La única limitación que conozco es que esta característica no es compatible con IE / Edge.

Igor Benikov
fuente
Lamentablemente no es compatible con IE, como de costumbre, en caso de que necesite admitir este navegador.
Lauren
0

Esta es mi versión en Coffeescript. También 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
fuente
0

Aquí hay uno simple y compacto si solo desea obtener rápidamente los parámetros de una solicitud 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;
}

Se convierte

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

en un objeto como

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

Crea una representación serializada de una matriz u objeto (se puede usar como cadena de consulta de URL para solicitudes 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
fuente
1
El código sin explicaciones no es bienvenido. ¿Podría ser por favor adelante y explique su código?
L. Guthardt
Crea una representación serializada de una matriz u objeto (puede usarse como cadena de consulta de URL para solicitudes AJAX)
Vishal Patel
Agregue explicaciones directamente en su respuesta, editándola. Sin embargo, no en los comentarios.
L. Guthardt
-1

las respuestas podrían usar un poco de elegancia 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);

tenedor en https://gist.github.com/956897

kares
fuente
-1

Puede usar la función .serializeArray()( Enlace ) de jQuery. Esta función devuelve una matriz de par clave-valor. Ejemplo de resultado:

[
  { name: "id", value: "1" },
  { name: "version", value: "100" }
]
Jefferson Henrique C. Soares
fuente
1
Esto no es lo que se le pidió. Quiere convertir una cuerda en un hash. serializeArray toma una forma y devuelve una matriz.
Daniel Bang