Funkcja odwrotna $ .param () w JavaScript / jQuery

122

Biorąc pod uwagę następujący formularz:

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

Potrafię użyć $.param( .. )konstrukcji do serializacji formularza:

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

=> foo=bar&hello=hello+world

Jak mogę deserializować powyższy ciąg za pomocą JavaScript i odzyskać skrót?

Na przykład,

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

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

Numer referencyjny: jQuery.param( obj ).

seb
źródło
2
Hej, właśnie dodam ten komentarz, abyś mógł zobaczyć aktualizację, którą zrobiłem w kodzie, na wypadek, gdybyś go używał ... Przypadkowo napisałem go tak, że zastąpił tylko pierwszy +. Teraz zastępuje je wszystkie!
Blixt
Istnieją wtyczki o nazwie QueryString. Zrobiłem jeden, ale nie akceptuje parametrów, czyta tylko z window.location.search. Pamiętam inne, które akceptują parametry ...
BrunoLM
1
refactored jquery BBQ deparam () jako moduł NPM bez zależności npmjs.com/package/deparam
alexey2baranov
alexey2baranov a może refaktoryzacja deparam () bez NPM jako zależności? :)
Andrew

Odpowiedzi:

62

Należy użyć jQuery BBQ „s deparam funkcję. Jest dobrze przetestowany i udokumentowany.

cce
źródło
Niezła wtyczka! Dzięki za udostępnienie.
Jonathan
29
Jeśli nie chcesz pobierać całej wtyczki BBQ, funkcja deparam została wyodrębniona jako samodzielna wtyczka tutaj: github.com/chrissrogers/jquery-deparam
Felipe Castro
2
Niestety strona github od lat nie widziała żadnych aktualizacji, a kiedy ją wypróbowałem, nie wydaje się być kompatybilna z najnowszym jQuery ... Wygląda jednak na to, czego potrzebuję.
pilawdzice
31

To jest nieco zmodyfikowana wersja funkcji, którą napisałem jakiś czas temu, aby zrobić coś podobnego.

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
źródło
1
Dokładnie to, co pomyślałem przy zaakceptowanej odpowiedzi „to nie zadziała z tablicami”. Twoje rozwiązanie działa prawidłowo.
Robert Koritnik
20

A co z tym krótkim, funkcjonalnym podejściem?

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

Przykład:

parseParams("this=is&just=an&example") // Object {this: "is", just: "an", example: undefined}
Joel Richard
źródło
1
To powinna być akceptowana odpowiedź, bez zewnętrznych zależności.
Michael Robinson,
Proste, niezawodne i wydajne rozwiązanie. Szacunek, sir.
fmquaglia,
5
To, co robi, jest z pewnością dobrym rozwiązaniem. Ale nie zajmuje się przekazywaniem tablic lub obiektów. Adres URL field[][]=a&field[0][]=b&field[0][]=cjest przetwarzany tak, jak Object { field[][]: "a", field[0][]: "c" }powinien resultobject.field[0] = Array [ "a", "b", "c" ]. Jest to zachowanie zgodne z oczekiwaniami w PHP. Rozwiązanie @ JackyLi dba o to.
min
16

Moja odpowiedź:

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
źródło
Tak! Tak! Tak! To jest dokładnie ten, którego potrzebuję, aby przeanalizować parametry, które są wysyłane przez JQuery w wywołaniu $ .ajax. To zwraca poprawnie zagnieżdżone skróty. Wielkie dzięki, Jacky Li!
Pascal Lindelauf
Jak dotąd najlepsze rozwiązanie - zachowuje się całkiem nieźle! Ale kiedy używam JSON.stringify(geturlargs('fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc').fld), dostaję, {"2":["2"],"3":["4"],"":"cc"}a nie [null,null,[2],[3,4],"bb","cc"]to, czego bym się spodziewał (to jest to, co dałby mi PHP).
min
1
To jest poprawna odpowiedź i proszę zignorować wszystkie inne odpowiedzi, nie działają one poprawnie
Andrew
1
Ta odpowiedź jest jedyną, która dotyczy mojego konkretnego przypadku użycia (gdzie przekazałem obiekt z zagnieżdżonymi kluczami / wartościami do $ .param jQuery, to prawidłowo uwadnia te wartości po pobraniu).
delinear
9

Korzystam z odpowiedzi Davida Dorwarda i zdałem sobie sprawę, że nie zachowuje się jak PHP lub Ruby on Rails, jak analizują parametry:

1) zmienna jest tablicą tylko wtedy, gdy kończy się na [], na przykład, a ?choice[]=1&choice[]=12nie wtedy, gdy jest?a=1&a=2

2) gdy istnieje wiele parametrów o tej samej nazwie, późniejsze zastępują wcześniejsze, tak jak na serwerach PHP (Ruby on Rails zachowuje pierwszy i ignoruje późniejsze), np. ?a=1&b=2&a=3

Modyfikując wersję Davida, mam:

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

który jest dość dokładnie testowany.

brak biegunowości
źródło
Specyfikacja uri jest taka, że? A = 1 i a = 2 powinny być tablicą. Ruby on Rails i PHP nie są zgodne z rzeczywistą specyfikacją.
adiktofsugar
Linia, w której dołączasz do tablicy, powinna być hash[k.substr(0, k.length-2)] = [v];ihash[k.substr(0, k.length-2)].push(v);
Baptiste Pernet,
Byłoby miło, gdyby można było to udostępnić przez npm
Erik van Velzen
7

Wiem, że to stary wątek, ale może jest w nim jeszcze jakieś znaczenie?

Zainspirowany dobrym rozwiązaniem Jacky Li, wypróbowałem własną, niewielką odmianę, mając na celu możliwość obsługi dowolnych kombinacji tablic i obiektów jako danych wejściowych. Przyjrzałem się, jak PHP by to zrobił i spróbowałem uzyskać coś „podobnego”. Oto mój kod:

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

Jeśli funkcja zostanie wywołana bez str-argumentu, zostanie przyjęta window.location.search.slice(1)jako dane wejściowe.

Kilka przykładów:

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

prowadzi do

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

Podczas gdy rozwiązanie Jacky Li stworzyłoby zewnętrzny pojemnik ajako zwykły przedmiot

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

getargs() sprawdza pierwszy podany indeks dla dowolnego poziomu, aby określić, czy ten poziom będzie obiektem (indeks nieliczbowy) czy tablicą (numeryczną lub pustą), w wyniku czego otrzymamy wynik, jak pokazano na liście powyżej (nr 6).

Jeśli bieżący obiekt jest tablicą, to null s są wstawiane wszędzie tam, gdzie jest to konieczne, aby przedstawić puste pozycje. Tablice są zawsze numerowane kolejno i oparte na 0).

Zauważ, że w przykładzie nr. 8 "autoinkrementacja" dla pustych indeksów nadal działa, mimo że mamy teraz do czynienia z obiektem, a nie tablicą.

O ile to przetestowałem, mój getargs()zachowuje się prawie identycznie jak świetna $.deparam() wtyczka jQuery Chrissa Rogera wspomniana w zaakceptowanej odpowiedzi. Główną różnicą jest to, że getargsdziała bez jQuery i robi autoinkrementację w obiektach, ale $.deparam()tego nie robi:

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

prowadzi do

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

W $.deparam()indeksie []jest interpretowany jako undefinedzamiast indeksu liczbowego z autoinkrementacją.

samochody10m
źródło
dzięki za tę wspaniałą funkcję. Zauważyłem jednak, że jeśli używasz liczby jako klucza w tablicy, np. '? A [5] [] = x', to klucz jest używany jako liczba podczas tworzenia obiektu i tym samym tworzy 5 pustych elementów w moim przypadku. Powinien traktować klucz numeryczny jako ciąg, a tym samym tworzyć obiekt z „5” (z cudzysłowami) jako klucz i x jako wartością. Mogę wymusić na adresie URL „? A [" 5 "] [] = x”, ale to jest brzydkie ...
Andrew
@Andrew: To była przemyślana decyzja projektowa z mojej strony: O ile dobrze pamiętam, rozwiązanie Jacka będzie zachowywało się bardziej tak, jak tego oczekujesz. Wprowadziłem wiersz o[k]=isNaN(idx[0])?{}:[];z zamiarem utworzenia tablicy, ilekroć napotkam indeks numeryczny jako pierwszy podany dla nowego obiektu. W przeciwnym razie utworzę ogólny obiekt. Do Ciebie należy modyfikacja tej części kodu, aby lepiej odpowiadała Twoim potrzebom. I. e. coś takiego o[k]={}powinno załatwić sprawę.
10m
dzięki. PS zdecydowanie powinieneś usunąć console.log w środku swojej funkcji;)
Andrew
@Andrew: Dzięki, właśnie to skomentowałem. Musiałem to przeoczyć, kiedy wysłałem kod.
samochody 10 m
6

Oto, jak możesz utworzyć nową funkcję 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
źródło
4
Nie podoba mi się ta funkcja. Dlaczego parametr bez wartości miałby otrzymać wartość „prawda”? Dlaczego nie null? Myślę, że ta decyzja projektowa może prowadzić do bardzo subtelnych błędów. Dlaczego nie poradzić sobie z sytuacją, w której parametr może mieć wiele wartości, zamiast wybierać „ostatnią” wartość? Rozwiązanie przesłane przez Davida jest znacznie lepsze.
SolutionYogi
4
Chodzi o to, trueaby można było sprawdzić if (params.redirect)lub podobnie. Jeśli chcesz się różnićtrue innymi wartościami, użyj if (params.redirect === true). nullWartość nie pomoże w żaden sposób, że mogę myśleć. Powodem, dla którego nie zrobiłem tego tak jak David, jest to, że cenię konsekwencję ponad elastyczność. Za pomocą jego metody muszę sprawdzić, czy wartość jest łańcuchem, czy tablicą, aby użyć jej wartości. Moim zdaniem zawsze powinien to być ciąg znaków ( truekonwertowana wartość, do 'true'której myślę, że jest w porządku) lub zawsze tablica. Wybrałem sznurek.
Blixt
Według tego konta, gdyby to było params.delete, byłoby ustawione na true i zrobię coś szkodliwego. Jak widać, wymyślenie przykładu jest łatwe. „null” jasno określa, że ​​żadna wartość nie istnieje, a decyzja jest pozostawiona dzwoniącemu, jak chce to zinterpretować. Jeśli chodzi o wiele wartości, spójrz na to w ten sposób. Zjadając, upewniasz się, że każdy dzwoniący spędzi czas na debugowaniu, dlaczego otrzymuje tylko jedną wartość, LUB później przyjdzie i zmodyfikuje kod. Zwracając tablicę z góry, wywołujący natychmiast będzie wiedział, jak sobie z nimi poradzić. Odrzucanie informacji nigdy nie jest dobre, IMHO.
SolutionYogi
2
Jeśli adres URL to /abc?delete, spodziewałbym się, że będzie tam wpis delete. Nie rozumiem, czym to się różni? Nie rozumiem nawet, jak możesz preferować inny kod z tego powodu, ponieważ ten kod ustawi wartość na ciąg, 'undefined'który nie jest lepszy. A jeśli chodzi o wiele wartości, to kwestia prostoty kontra elastyczność. Rzadko widzę użycie wielu wartości w ciągach zapytań, ale jeśli ich potrzebujesz, zawsze zwracaj tablicę z 1+ wartościami. Nigdy nie mieszaj typu powrotu; wtedy będziesz musiał spędzić czas do debugowania, ponieważ to, co zwykle nagle ciąg mógłby być tablicą.
Blixt,
Dzięki. Myślę, że nie ma srebrnej kuli. Wziąłem twój kod i trochę go zmodyfikowałem, usunąłem wartości logiczne, dodałem parsowanie parametrów tablicy. ? foo [] = 1 & foo [] = 2 => foo: ["1", "2"]
seb
6

Dzięki niemu http://james.padolsey.com/javascript/parsing-urls-with-the-dom/

Całkiem proste: 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
źródło
2
Nie działa to w przypadku pól wyboru z wieloma opcjami, ponieważ zachowuje tylko ostatnio wybrane.
Fernando Fabreti
Przepraszam, ale nie rozumiem, o co chodzi w komentarzu. Funkcja, do której się tu odwołujemy, polega na odserializowaniu / analizowaniu identyfikatora URI z parametrami, takimi jak ?something=1&param2=value2w tablicy. Co masz na myśli, mówiąc „nie działają z polami wyboru z wieloma opcjami”?
brutuscat
4

Oto moja implementacja JavaScript, której używam na stronie serwera JScript ASP Classic ( demonstracja ):

// 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
źródło
Jak dotąd najlepsze, jakie znalazłem dla zagnieżdżonych tablic
ymakux
3

Użyj tego :

// 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
źródło
1

Wymyśliłem takie rozwiązanie, które zachowuje się jak funkcja .Net HttpUtility.ParseQueryString.

W rezultacie parametry ciągu zapytania są przechowywane we właściwościach jako listy wartości, więc qsObj["param"]będzie to to samo, co wywołanie GetValues("param").Net.

Mam nadzieję, że to lubisz. JQuery nie jest wymagane.

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

Oto jak z niego korzystać:

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

Aby wyświetlić podgląd wyniku w konsoli juste, wpisz:

JSON.stringify(qsObj)

Wynik:

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

źródło
1

W CSS-Tricks (oryginalne źródło od Nicholasa Ortenzio ) jest piękny, jednoliniowy tekst :

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

Naprawdę sprytną częścią jest sposób, w jaki wykorzystuje thisobiekt funkcji anonimowej , dodając parę klucz / wartość dla każdego zapytania w ciągu. To powiedziawszy, jest miejsce na poprawę. Zmodyfikowałem go nieco poniżej, wprowadzając następujące zmiany:

  1. Dodano obsługę pustych ciągów i danych wejściowych niebędących ciągami.

  2. Obsługiwane ciągi zakodowane w identyfikatorze URI ( %40-> @itd.).

  3. Usunięto domyślne użycie, document.location.searchgdy dane wejściowe były puste.

  4. Zmieniono nazwę, uczyniłem ją bardziej czytelną, dodano komentarze.

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
źródło
1

To naprawdę stare pytanie, ale w miarę zbliżania się - inne osoby mogą przyjść do tego posta, a ja chcę trochę odświeżyć ten motyw. Dziś nie ma potrzeby tworzenia niestandardowych rozwiązań - jest interfejs 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);
}

Jedyne ograniczenie, które znam - ta funkcja nie jest obsługiwana w IE / Edge.

Igor Benikov
źródło
Niestety nie jest obsługiwane przez IE, jak zwykle, na wypadek, gdybyś musiał obsługiwać tę przeglądarkę.
Lauren,
0

To jest moja wersja w Coffeescript. Działa również w przypadku adresów URL, takich jak 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
źródło
0

Oto prosty i kompaktowy, jeśli chcesz tylko szybko uzyskać parametry z żądania 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;
}

Konwertuje

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

w obiekt taki jak

{aa:1,bb:2,cc:3}
dkellner
źródło
0

Tworzy serializowaną reprezentację tablicy lub obiektu (może służyć jako ciąg zapytania URL dla żądań 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
źródło
1
Kod bez wyjaśnień nie jest mile widziany. Czy mógłbyś kontynuować i wyjaśnić swój kod?
L. Guthardt
Tworzy reprezentację serializacji tablicy lub obiektu (może być używana jako ciąg zapytania URL dla żądań AJAX)
Vishal Patel
Dodaj wyjaśnienia bezpośrednio do odpowiedzi, edytując ją. Nie w komentarzach.
L. Guthardt
-1

odpowiedzi przydałoby się odrobinę elegancji 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);

widelec na https://gist.github.com/956897

kares
źródło
-1

Możesz użyć funkcji .serializeArray()( Link ) samego jQuery. Ta funkcja zwraca tablicę par klucz-wartość. Przykład wyniku:

[
  { name: "id", value: "1" },
  { name: "version", value: "100" }
]
Jefferson Henrique C. Soares
źródło
1
Nie o to pytano. Chce zamienić sznurek w haszysz. serializeArray przyjmuje postać i zwraca tablicę.
Daniel Bang