122 votes

La fonction inverse $ .param () dans JavaScript / jQuery

Compte tenu de la forme suivante:

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

Je peux utiliser la construction $.param( .. ) pour sérialiser le formulaire:

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

=> foo=bar&hello=hello+world
 

Comment puis-je désérialiser la chaîne ci-dessus avec JavaScript et obtenir un hachage?

Par exemple,

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

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

Référence: jQuery.param( obj ) .

62voto

cce Points 1430

Vous devez utiliser la fonction deparam de jQuery BBQ . C'est bien testé et documenté.

31voto

Quentin Points 325526

Ceci est une version légèrement modifiée d'une fonction que j'ai écrite il y a longtemps pour faire quelque chose de similaire.

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

9voto

動靜能量 Points 33008

Je suis l'aide de David Dorward réponse, et a compris qu'il ne se comporte pas comme PHP ou Ruby on Rails comment ils analyser les params:

1) une variable est seulement un tableau si il se termine par [], comme ?choice[]=1&choice[]=12, pas quand il est ?a=1&a=2

2) lorsque plusieurs params existe avec le même nom, les plus tard remplace les précédentes, comme sur les serveurs PHP (Ruby on Rails garder la première et ignorer celles plus tard), comme ?a=1&b=2&a=3

Donc, la modification de David version, j'ai:

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] = [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].push(v);
    }
  } 
  return hash;
};

qui est testé de manière assez complète.

6voto

Blixt Points 23266

Voici comment créer une nouvelle fonction 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;
};
 

6voto

brutuscat Points 1912

Merci à lui http://james.padolsey.com/javascript/parsing-urls-with-the-dom/

Assez facile: 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;}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X