La funzione inversa $ .param () in JavaScript / jQuery


122

Data la seguente forma:

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

Posso usare il $.param( .. )costrutto per serializzare il modulo:

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

=> foo=bar&hello=hello+world

Come posso deserializzare la stringa precedente con JavaScript e recuperare un hash?

Per esempio,

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

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

Riferimento: jQuery.param( obj ).


2
Ehi, sto solo aggiungendo questo commento in modo che tu possa vedere l'aggiornamento che ho fatto al codice, nel caso tu lo stia usando ... L'avevo scritto per sbaglio in modo che sostituisse solo il primo +. Ora li sostituisce tutti!
Blixt

Ci sono plugin chiamati QueryString. Ne ho fatto uno ma non accetta parametri, legge solo da window.location.search. Ricordo altri che accettano parametri ...
BrunoLM

1
metodo jquery BBQ deparam () modificato come modulo NPM senza dipendenze npmjs.com/package/deparam
alexey2baranov

alexey2baranov che ne dici di refactoring deparam () senza NPM come dipendenza? :)
Andrew

Risposte:


62

Dovresti usare la funzione deparam di jQuery BBQ . È ben testato e documentato.


Bel plugin! Grazie per la condivisione.
Jonathan

29
Se non si desidera ottenere l'intero plug-in BBQ, la funzione deparam è stata estratta come plug-in autonomo qui: github.com/chrissrogers/jquery-deparam
Felipe Castro

2
Sfortunatamente la pagina github non ha visto aggiornamenti da anni, e quando l'ho provata non sembra compatibile con l'ultimo jQuery ... Sembra quello che mi serve però.
pilavdzice

31

Questa è una versione leggermente modificata di una funzione che ho scritto tempo fa per fare qualcosa di simile.

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

1
Esattamente quello che pensavo con la risposta accettata "questo non funzionerà con gli array". La tua soluzione funziona bene.
Robert Koritnik,

20

Che ne dici di questo breve approccio funzionale?

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

Esempio:

parseParams("this=is&just=an&example") // Object {this: "is", just: "an", example: undefined}

1
Questa dovrebbe essere la risposta accettata, nessuna dipendenza esterna.
Michael Robinson

Soluzione semplice, affidabile e potente. Rispetto, signore.
fmquaglia

5
Per quello che fa è sicuramente una buona soluzione. Ma non si occupa del passaggio di array o oggetti. L'URL field[][]=a&field[0][]=b&field[0][]=cviene elaborato come Object { field[][]: "a", field[0][]: "c" }dovrebbe essere resultobject.field[0] = Array [ "a", "b", "c" ]. Questo è il comportamento previsto da PHP. La soluzione di @ JackyLi si prende cura di questo.
cars10m

16

La mia risposta:

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

Sì! Sì! Sì! Questo è esattamente quello di cui ho bisogno per analizzare i parametri che vengono inviati da JQuery in una chiamata $ .ajax. Ciò restituisce gli hash nidificati correttamente. Grazie mille, Jacky Li!
Pascal Lindelauf

La migliore soluzione finora: si comporta abbastanza bene! Ma quando lo uso JSON.stringify(geturlargs('fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc').fld)ottengo {"2":["2"],"3":["4"],"":"cc"}e non [null,null,[2],[3,4],"bb","cc"]quello che avrei sperato (questo è quello che mi darebbe PHP).
cars10m

1
Questa è LA risposta corretta e per favore ignora tutte le altre risposte, non funzionano correttamente
Andrew

1
Questa risposta è l'unica che ha affrontato il mio caso d'uso particolare (in cui ho passato un oggetto con chiave / valori nidificati a $ .param di jQuery, questo idrata adeguatamente quei valori al momento del recupero).
delineare il

9

Sto usando la risposta di David Dorward e mi sono reso conto che non si comporta come PHP o Ruby on Rails come analizzano i parametri:

1) una variabile è un array solo se termina con [], ad esempio ?choice[]=1&choice[]=12, non quando lo è?a=1&a=2

2) quando esistono più parametri con lo stesso nome, quelli successivi sostituiscono i precedenti, come sui server PHP (Ruby on Rails mantiene il primo e ignora i successivi), come ?a=1&b=2&a=3

Quindi, modificando la versione di David, ho:

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

che è testato abbastanza accuratamente.


La specifica uri è che? A = 1 & a = 2 dovrebbe essere un array. Ruby on Rails e PHP non seguono le specifiche effettive.
adiktofsugar

La riga in cui aggiungere all'array dovrebbe essere hash[k.substr(0, k.length-2)] = [v];ehash[k.substr(0, k.length-2)].push(v);
Baptiste Pernet

Sarebbe bello se questo potesse essere reso disponibile tramite npm
Erik van Velzen

7

So che questo è un vecchio thread, ma forse c'è ancora qualche rilevanza in esso?

Ispirato dalla buona soluzione di Jacky Li, ho provato una mia leggera variazione con l'obiettivo di essere in grado di occuparmi anche di combinazioni arbitrarie di array e oggetti come input. Ho guardato come avrebbe fatto PHP e ho cercato di ottenere qualcosa di "simile". Ecco il mio codice:

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 la funzione viene chiamata senza l' strargomento, assumerà window.location.search.slice(1)come input.

Qualche esempio:

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

risultati in

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

Mentre la soluzione di Jacky Li produrrebbe il contenitore esterno acome un semplice oggetto

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

getargs() esamina il primo indice dato per ogni livello per determinare se questo livello sarà un oggetto (indice non numerico) o un array (numerico o vuoto), risultando così nell'output come mostrato nell'elenco bove (n. 6).

Se l'oggetto corrente è un array null, viene inserito se necessario per rappresentare posizioni vuote. Gli array sono sempre numerati consecutivamente e basati su 0).

Si noti che nell'esempio n. 8 "l'autoincremento" per gli indici vuoti funziona ancora, anche se ora abbiamo a che fare con un oggetto e non con un array.

Per quanto l'ho testato, il mio getargs()si comporta in modo praticamente identico al fantastico $.deparam() plugin jQuery di Chriss Roger menzionato nella risposta accettata. La differenza principale è che getargscorre senza jQuery e che fa autoincrement negli oggetti mentre $.deparam()si non farlo:

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

risultati in

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

In $.deparam()l'indice []viene interpretato come undefinedinvece di un indice numerico autoincremented.


grazie per questa fantastica funzione. Tuttavia ho notato che se usi il numero come chiave nell'array, ad esempio come '? A [5] [] = x', la chiave viene utilizzata come numero durante la creazione dell'oggetto e quindi crea 5 elementi vuoti nel mio caso. Dovrebbe trattare la chiave numerica come una stringa e quindi creare un oggetto con "5" (tra virgolette) come chiave e x come valore. Potrei forzare l'URL a essere "? A [" 5 "] [] = x" ma è brutto ...
Andrew

@Andrew: Questa è stata una mia decisione progettuale deliberata: per quanto ricordo, la soluzione di Jack si comporterà di più nel modo in cui te lo aspetti. Ho introdotto la riga o[k]=isNaN(idx[0])?{}:[];con l'intenzione di creare un array, ogni volta che incontro un indice numerico come primo dato per un nuovo oggetto. Altrimenti creerò un oggetto generico. Spetta a te modificare quella parte del codice per adattarla meglio alle tue esigenze. I. e. qualcosa di simile o[k]={}dovrebbe fare il trucco.
cars10m

Grazie. PS dovresti assolutamente rimuovere console.log nel mezzo della tua funzione;)
Andrew

@ Andrew: Grazie, l'ho appena commentato. Devo averlo trascurato quando ho pubblicato il codice.
cars10m

6

Ecco come puoi creare una nuova funzione 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;
};

4
Non mi piace questa funzione. Perché un parametro senza valore dovrebbe ottenere il valore di "true"? Perché non null? Penso che questa decisione di progettazione possa portare a bug molto sottili. Inoltre, perché non gestire la situazione in cui il parametro può avere più valori invece di selezionare il valore "ultimo"? La soluzione pubblicata da David è molto migliore.
Soluzione

4
È truecosì che si può controllare if (params.redirect)o simili. Se vuoi differire tra truee un altro valore, dovresti usare if (params.redirect === true). Un nullvalore non aiuterebbe in alcun modo a cui posso pensare. Il motivo per cui non l'ho fatto come David è perché apprezzo la coerenza rispetto alla flessibilità. Con il suo metodo devo controllare se il valore è una stringa o un array per usarne il valore. A mio parere, dovrebbe sempre essere una stringa (il truevalore viene convertito in 'true'cui penso vada bene), o essere sempre un array. Ho scelto la stringa.
Blixt

In base a questo account, se fosse params.delete, sarebbe impostato su true e farò qualcosa di dannoso. Come puoi vedere, trovare un esempio è facile. 'null' specifica chiaramente che non esiste alcun valore e la decisione è lasciata al chiamante come vuole interpretarlo. Riguardo a più valori, guarda in questo modo. Mangiando, ti stai assicurando che entrambi i chiamanti impiegheranno del tempo a correggere il motivo per cui sta ottenendo un solo valore OPPURE in seguito vengono a modificare il codice. Restituendo l'array in anticipo, il chiamante saprà immediatamente come gestirli. Scartare le informazioni non è mai positivo, IMHO.
Soluzione

2
Se l'URL è, /abc?deletemi aspetto che ci sia una voce per delete. Non vedo come sia diverso? Non vedo nemmeno come puoi preferire l'altro codice per questo motivo, perché quel codice imposterà il valore sulla stringa 'undefined'che non è migliore. E per quanto riguarda i valori multipli, è un caso di semplicità contro flessibilità. Raramente vedo l'uso di più valori nelle stringhe di query, ma se li desideri, restituisci sempre un array con 1+ valori. Non mescolare mai il tipo di reso; allora si avrà bisogno di spendere tempo per eseguire il debug perché ciò che di solito era una stringa potrebbe improvvisamente essere un array.
Blixt

Grazie. Non credo che ci sia una pallottola d'argento. Ho preso il tuo codice e l'ho modificato un po ', rimosso i valori booleani, aggiunto l'analisi dei parametri dell'array. ? foo [] = 1 & foo [] = 2 => foo: ["1", "2"]
seb

6

Grazie a lui http://james.padolsey.com/javascript/parsing-urls-with-the-dom/

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

2
Questo non funziona con le caselle di selezione con più opzioni, perché mantiene solo l'ultima selezionata.
Fernando Fabreti

Mi dispiace ma non riesco a vedere a cosa ti riferisci nel commento. La funzione a cui si fa riferimento qui è di deserializzare / analizzare un URI con parametri come ?something=1&param2=value2in un array. Cosa intendi con "non funziona con caselle selezionate con più opzioni"?
brutuscat

4

Ecco la mia implementazione JavaScript che utilizzo in una pagina classica ASP JScript lato server ( 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;
}

Finora il migliore che ho trovato per gli array annidati
ymakux

3

Usa questo :

// 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);

1

Ho trovato questa soluzione, che si comporta come la funzione .Net HttpUtility.ParseQueryString.

Nel risultato, i parametri della stringa di query vengono memorizzati nelle proprietà come elenchi di valori, quindi qsObj["param"]sarà lo stesso della chiamata GetValues("param")in .Net.

Spero vi piaccia. JQuery non richiesto.

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

Ecco come usarlo:

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

Per visualizzare in anteprima il risultato nella console, digitare:

JSON.stringify(qsObj)

Produzione:

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

1

C'è una bellissima battuta su CSS-Tricks (fonte originale di 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 davvero intelligente è come utilizza l' thisoggetto della funzione anonima , aggiungendo una coppia chiave / valore per ciascuna delle query nella stringa. Detto questo, c'è un margine di miglioramento. L'ho modificato un po 'di seguito, con le seguenti modifiche:

  1. Aggiunta la gestione di stringhe vuote e input non di stringhe.

  2. Stringhe con codifica URI gestite ( %40-> @, ecc.).

  3. Rimosso l'uso predefinito di document.location.searchquando l'input era vuoto.

  4. Modificato il nome, reso più leggibile, aggiunti commenti.

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

1

Questa è davvero una vecchia domanda, ma visto che sto arrivando, altre persone potrebbero venire a questo post e voglio aggiornare un po 'questo tema. Oggi non è necessario creare soluzioni personalizzate: è disponibile l' interfaccia 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);
}

L'unica limitazione che conosco: questa funzione non è supportata in IE / Edge.


Sfortunatamente non è supportato da IE, come al solito, nel caso in cui sia necessario supportare questo browser.
Lauren

0

Questa è la mia versione in Coffeescript. Funziona anche per url come 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

0

Eccone uno semplice e compatto se vuoi solo ottenere rapidamente i parametri da una richiesta 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;
}

Si converte

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

in un oggetto come

{aa:1,bb:2,cc:3}

0

Crea una rappresentazione serializzata di un array o di un oggetto (può essere utilizzata come stringa di query URL per richieste 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

1
Il codice senza spiegazioni non è il benvenuto. Potrebbe essere per favore, vai avanti e spiega il tuo codice?
L. Guthardt

Crea una rappresentazione serializzata di un array o di un oggetto (può essere utilizzata come stringa di query URL per richieste AJAX)
Vishal Patel

Si prega di aggiungere spiegazioni direttamente nella risposta, modificandola. Non nei commenti però.
L. Guthardt

-1

le risposte potrebbero usare un po 'di eleganza 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 su https://gist.github.com/956897


-1

Puoi usare la funzione .serializeArray()( Link ) di jQuery stesso. Questa funzione restituisce un array di coppie chiave-valore. Esempio di risultato:

[
  { name: "id", value: "1" },
  { name: "version", value: "100" }
]

1
Questo non è ciò che è stato chiesto. Vuole trasformare una stringa in un hash. serializeArray assume una forma e restituisce un array.
Daniel Bang
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.