Ich habe eine Zeichenfolge wie diese:
abc=foo&def=%5Basf%5D&xyz=5
Wie kann ich es in ein solches JavaScript-Objekt konvertieren?
{
abc: 'foo',
def: '[asf]',
xyz: 5
}
Ich habe eine Zeichenfolge wie diese:
abc=foo&def=%5Basf%5D&xyz=5
Wie kann ich es in ein solches JavaScript-Objekt konvertieren?
{
abc: 'foo',
def: '[asf]',
xyz: 5
}
Antworten:
Bearbeiten
Diese Bearbeitung verbessert und erklärt die Antwort anhand der Kommentare.
Beispiel
Analysieren Sie
abc=foo&def=%5Basf%5D&xyz=5
in fünf Schritten:abc=foo","def=[asf]","xyz=5
abc":"foo","def":"[asf]","xyz":"5
{"abc":"foo","def":"[asf]","xyz":"5"}
Das ist legal JSON.
Eine verbesserte Lösung ermöglicht mehr Zeichen in der Suchzeichenfolge. Es verwendet eine Reviver-Funktion für die URI-Decodierung:
Beispiel
gibt
Ursprüngliche Antwort
Ein Einzeiler:
quelle
JSON.parse('{"' + decodeURI(location.search.substring(1).replace(/&/g, "\",\"").replace(/=/g, "\":\"")) + '"}')
2020 ES6 / 7/8 und auf Annäherung
Ab ES6 bietet Javascript mehrere Konstrukte an, um eine performante Lösung für dieses Problem zu erstellen.
Dies umfasst die Verwendung von URLSearchParams und Iteratoren
Sollte Ihr Anwendungsfall erfordern, dass Sie es tatsächlich in ein Objekt konvertieren, können Sie die folgende Funktion implementieren:
Grundlegende Demo
Verwenden von Object.fromEntries und verbreiten
Wir verwenden Object.fromEntries (die derzeit in der Stufe 4), ersetzt
paramsToObject
mitObject.fromEntries(entries)
.Da
URLParams
ein iterierbares Objekt zurückgegeben wird, führt die Verwendung des Spread-Operators anstelle des Aufrufs.entries
auch zu Einträgen gemäß seiner Spezifikation:Hinweis: Alle Werte sind automatisch Zeichenfolgen gemäß der URLSearchParams-Spezifikation
Mehrere gleiche Schlüssel
Wie @siipe hervorhob , werden Zeichenfolgen, die mehrere Werte mit demselben Schlüssel enthalten, zum letzten verfügbaren Wert gezwungen:
foo=first_value&foo=second_value
wird im Wesentlichen zu :{foo: "second_value"}
.Gemäß dieser Antwort: https://stackoverflow.com/a/1746566/1194694 gibt es keine Spezifikation für die Entscheidung, was damit zu tun ist, und jedes Framework kann sich anders verhalten.
Ein häufiger Anwendungsfall besteht darin, die beiden gleichen Werte zu einem Array zusammenzufügen und das Ausgabeobjekt in Folgendes umzuwandeln:
Dies kann mit folgendem Code erreicht werden:
quelle
search string
Parser handelt - wofür er entwickelt wurde, unabhängig davon,Object.fromEntries
funktioniert nicht für wiederholte Tasten. Wenn wir versuchen, so etwas zu tun?foo=bar1&foo=bar2
, bekommen wir nur{ foo: 'bar2' }
. Das Anforderungsobjekt von Node.js analysiert es beispielsweise als{ foo: ['bar1', 'bar2'] }
let temp={};Object.keys(params).map(key=>{temp[key]=urlParams.getAll(key)})
ES6 Einzeiler. Sauber und einfach.
Für Ihren speziellen Fall wäre es:
quelle
"http://place.com?foo=bar&hello=%40world&showThing"
produziert{ hello: "@world", http://place.com?foo: "bar", showThing: "" }
?someValue=false
wird{ someValue: "false" }
?foo=bar1&foo=bar2
, bekommen wir nur{ foo: 'bar2' }
. Das Anforderungsobjekt von Node.js analysiert es als{ foo: ['bar1', 'bar2'] }
location.search
Teilen Sie auf
&
, um Name / Wert-Paare zu erhalten, und teilen Sie dann jedes Paar auf=
. Hier ist ein Beispiel:Ein anderer Ansatz, der reguläre Ausdrücke verwendet:
Dies ist aus John Resigs "Suchen und nicht ersetzen" angepasst .
quelle
Eine prägnante Lösung:
quelle
Die vorgeschlagenen Lösungen, die ich bisher gefunden habe, decken keine komplexeren Szenarien ab.
Ich musste eine Abfragezeichenfolge wie konvertieren
https://random.url.com?Target=Offer&Method=findAll&filters%5Bhas_goals_enabled%5D%5BTRUE%5D=1&filters%5Bstatus%5D=active&fields%5B%5D=id&fields%5B%5D=name&fields%5B%5D=default_goal_name
in ein Objekt wie:
ODER:
https://random.url.com?Target=Report&Method=getStats&fields%5B%5D=Offer.name&fields%5B%5D=Advertiser.company&fields%5B%5D=Stat.clicks&fields%5B%5D=Stat.conversions&fields%5B%5D=Stat.cpa&fields%5B%5D=Stat.payout&fields%5B%5D=Stat.date&fields%5B%5D=Stat.offer_id&fields%5B%5D=Affiliate.company&groups%5B%5D=Stat.offer_id&groups%5B%5D=Stat.date&filters%5BStat.affiliate_id%5D%5Bconditional%5D=EQUAL_TO&filters%5BStat.affiliate_id%5D%5Bvalues%5D=1831&limit=9999
IN:
Ich habe mehrere Lösungen zusammengestellt und angepasst, die tatsächlich funktionieren:
CODE:
quelle
obj=encodeURIComponent(JSON.stringify({what:{ever:','},i:['like']}))
.Dies ist die einfache Version. Natürlich möchten Sie einige Fehlerprüfungen hinzufügen:
quelle
JSON.parse('{"' + decodeURIComponent(query.replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}'));
arbeitet für michname[]=test1&name[]=test2
und es wird dazu führenname[]=test2
Ich fand $ .String.deparam die vollständigste vorgefertigte Lösung (kann verschachtelte Objekte usw. ausführen ). Lesen Sie die Dokumentation .
quelle
2019 Einzeiler-Ansatz
Für Ihren speziellen Fall:
Für den allgemeineren Fall, in dem jemand Abfrageparameter für ein Objekt analysieren möchte:
Wenn Sie Object.fromEntries nicht verwenden können, funktioniert dies auch:
quelle
[...new URLSearchParams(window.location.search)].reduce((o, i) => ({ ...o, [i[0]]: i[1] }), {});
"http://place.com?foo=bar&hello=%40world&showThing
produziert{ hello: "@world", http://place.com?foo: "bar", showThing: "" }
. Versuchen Sie hinzuzufügenstr.split("?").pop()
Eine weitere Lösung, die auf dem neuesten Standard von URLSearchParams basiert ( https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams ).
Bitte beachten Sie, dass diese Lösung verwendet wird
Array.from ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from )
und _.fromPairs ( https://lodash.com/docs#fromPairs ) von lodash der Einfachheit halber.
Es sollte einfach sein, eine kompatiblere Lösung zu erstellen, da Sie Zugriff auf den Iterator searchParams.entries () haben .
quelle
Ich hatte das gleiche Problem, habe die Lösungen hier ausprobiert, aber keine davon hat wirklich funktioniert, da ich Arrays in den URL-Parametern hatte, wie folgt:
Also habe ich meine eigene JS-Funktion geschrieben, die aus dem Parameter in URI ein Array macht:
quelle
if(chunk[0].search("\\[\\]") !== -1) {
das istchunk[0]=chunk[0].replace(/\[\]$/,'');
const
statt,var
weil jemand dies tun könntecreateObjFromURI = 'some text'
und dann den Code durcheinander bringen würde. Wenn Sie verwenden,const
wird jemandcreateObjFromURI = 'some text'
, der einen Fehler macht, der konstanten Variablen keinen Wert zuweisen können.Verwenden von ES6, URL API und URLSearchParams API.
quelle
ES6 One Liner (wenn wir es so nennen können, wenn wir die lange Schlange sehen)
[...new URLSearchParams(location.search).entries()].reduce((prev, [key,val]) => {prev[key] = val; return prev}, {})
quelle
cur
für zusätzliche Klarheit destrukturieren ..reduce((prev, [key, val]) => {prev[key] = val})
Ziemlich einfach mit der
URLSearchParams
JavaScript-Web-API,Nützliche Links
quelle
Für Node JS können Sie die Node JS-API verwenden
querystring
:Dokumentation: https://nodejs.org/api/querystring.html
quelle
Es gibt keine native Lösung, die mir bekannt ist. Dojo verfügt über eine integrierte Unserialisierungsmethode, wenn Sie dieses Framework zufällig verwenden.
Ansonsten können Sie es ganz einfach selbst implementieren:
edit: decodeURIComponent () hinzugefügt
quelle
Es gibt eine leichte Bibliothek namens YouAreI.js , die getestet wurde und dies wirklich einfach macht.
quelle
Eine der einfachsten Möglichkeiten, dies über die URLSearchParam-Schnittstelle zu tun.
Unten ist das Arbeitscode-Snippet:
quelle
Dies scheint die beste Lösung zu sein, da mehrere gleichnamige Parameter berücksichtigt werden.
Ich habe mich später entschlossen, es auch in ein jQuery-Plugin zu konvertieren ...
Jetzt akzeptiert der erste nur die Parameter, aber das jQuery-Plugin übernimmt die gesamte URL und gibt die serialisierten Parameter zurück.
quelle
Hier ist eine, die ich benutze:
Grundlegende Verwendung, z.
?a=aa&b=bb
Object {a: "aa", b: "bb"}
Doppelte Parameter, z.
?a=aa&b=bb&c=cc&c=potato
Object {a: "aa", b: "bb", c: ["cc","potato"]}
Fehlende Schlüssel, z.
?a=aa&b=bb&=cc
Object {a: "aa", b: "bb"}
Fehlende Werte, z.
?a=aa&b=bb&c
Object {a: "aa", b: "bb"}
Die obigen JSON / Regex-Lösungen werfen einen Syntaxfehler auf diese verrückte URL:
?a=aa&b=bb&c=&=dd&e
Object {a: "aa", b: "bb", c: ""}
quelle
Hier ist meine schnelle und schmutzige Version, die im Grunde genommen die durch '&' getrennten URL-Parameter in Array-Elemente aufteilt und dann über dieses Array iteriert und Schlüssel / Wert-Paare hinzufügt, die durch '=' in ein Objekt getrennt sind. Ich verwende decodeURIComponent (), um die codierten Zeichen in ihre normalen Zeichenfolgenäquivalente zu übersetzen (so wird% 20 zu einem Leerzeichen,% 26 zu '&' usw.):
Beispiel:
kehrt zurück
Das einzige Problem ist, dass xyz eine Zeichenfolge und keine Zahl ist (aufgrund der Verwendung von decodeURIComponent ()), aber darüber hinaus kein schlechter Ausgangspunkt.
quelle
quelle
Babel
Hilfe können Sie es gut unter anderenVerwenden von phpjs
quelle
Aufbauend auf Mike Causers Antwort habe ich diese Funktion erstellt, die mehrere Parameter mit demselben Schlüssel berücksichtigt (
foo=bar&foo=baz
) und auch durch Kommas getrennte Parameter (foo=bar,baz,bin
) berücksichtigt . Außerdem können Sie nach einem bestimmten Abfrageschlüssel suchen.Beispieleingabe:
foo.html?foo=bar&foo=baz&foo=bez,boz,buz&bar=1,2,3
Beispielausgabe
quelle
Wenn Sie URI.js verwenden, können Sie Folgendes verwenden:
https://medialize.github.io/URI.js/docs.html#static-parseQuery
quelle
quelle
ZUERST MÜSSEN SIE DEFINIEREN, WAS EIN GET VAR IST:
Als gerade gelesen:
und benutze wie:
quelle
Ich musste mich auch
+
im Abfrageteil der URL damit befassen ( decodeURIComponent nicht ), also habe ich Wolfgangs Code so angepasst, dass er:In meinem Fall verwende ich jQuery, um URL-fähige Formularparameter abzurufen. Dann diesen Trick, um ein Objekt daraus zu erstellen. Anschließend kann ich problemlos Parameter für das Objekt aktualisieren und die Abfrage-URL neu erstellen, z.
quelle
Ich mache es so:
quelle
Wenn Sie eine Rekursion benötigen, können Sie die winzige js-extension-ling- Bibliothek verwenden.
Dies gibt ungefähr Folgendes aus:
Hinweis: Es basiert auf der Funktion locutus parse_str ( https://locutus.io/php/strings/parse_str/ ).
quelle