J'ai une chaîne comme celle-ci:
abc=foo&def=%5Basf%5D&xyz=5
Comment puis-je le convertir en un objet JavaScript comme celui-ci?
{
abc: 'foo',
def: '[asf]',
xyz: 5
}
J'ai une chaîne comme celle-ci:
abc=foo&def=%5Basf%5D&xyz=5
Comment puis-je le convertir en un objet JavaScript comme celui-ci?
{
abc: 'foo',
def: '[asf]',
xyz: 5
}
Réponses:
Éditer
Cette modification améliore et explique la réponse sur la base des commentaires.
Exemple
Analysez
abc=foo&def=%5Basf%5D&xyz=5
en cinq étapes:abc=foo","def=[asf]","xyz=5
abc":"foo","def":"[asf]","xyz":"5
{"abc":"foo","def":"[asf]","xyz":"5"}
qui est JSON légal.
Une solution améliorée permet d'ajouter plus de caractères dans la chaîne de recherche. Il utilise une fonction reviver pour le décodage URI:
Exemple
donne
Réponse originale
Un one-liner:
la source
JSON.parse('{"' + decodeURI(location.search.substring(1).replace(/&/g, "\",\"").replace(/=/g, "\":\"")) + '"}')
2020 ES6 / 7/8 et en approche
À partir d'ES6 et suivants, Javascript propose plusieurs constructions afin de créer une solution performante pour ce problème.
Cela inclut l'utilisation de URLSearchParams et des itérateurs
Si votre cas d'utilisation vous oblige à le convertir réellement en objet, vous pouvez implémenter la fonction suivante:
Démo de base
Utilisation d'Object.fromEntries et propagation
Nous pouvons utiliser Object.fromEntries (qui est actuellement à l'étape 4), en remplaçant
paramsToObject
parObject.fromEntries(entries)
.Depuis
URLParams
, retourne un objet itérable , utiliser l' opérateur spread au lieu d'appeler.entries
produira également des entrées selon sa spécification:Remarque: Toutes les valeurs sont automatiquement des chaînes selon la spécification URLSearchParams
Plusieurs clés identiques
Comme @siipe a souligné, des chaînes contenant plusieurs valeurs de même clés seront contraints à la dernière valeur disponible:
foo=first_value&foo=second_value
sera essentiellement devenir:{foo: "second_value"}
.Selon cette réponse: https://stackoverflow.com/a/1746566/1194694 il n'y a aucune spécification pour décider quoi en faire et chaque framework peut se comporter différemment.
Un cas d'utilisation courant consistera à joindre les deux mêmes valeurs dans un tableau, transformant l'objet de sortie en:
Cela peut être réalisé avec le code suivant:
la source
search string
analyseur - c'est ce qu'il a été conçu pour faire, indépendamment du fait qu'il soit associé à une URLObject.fromEntries
ne fonctionne pas pour les touches répétées. Si nous essayons de faire quelque chose comme ça?foo=bar1&foo=bar2
, nous n'obtiendrons que{ foo: 'bar2' }
. L'objet de requête Node.js, par exemple, le traite comme{ foo: ['bar1', 'bar2'] }
let temp={};Object.keys(params).map(key=>{temp[key]=urlParams.getAll(key)})
ES6 une doublure. Propre et simple.
Pour votre cas spécifique, ce serait:
la source
"http://place.com?foo=bar&hello=%40world&showThing"
produit{ hello: "@world", http://place.com?foo: "bar", showThing: "" }
?someValue=false
devient{ someValue: "false" }
?foo=bar1&foo=bar2
, nous n'obtiendrons que{ foo: 'bar2' }
. L'objet de requête Node.js le traite comme{ foo: ['bar1', 'bar2'] }
location.search
Partager
&
pour obtenir des paires nom / valeur, puis divisez chaque paire=
. Voici un exemple:Une autre approche, utilisant des expressions régulières:
Ceci est adapté de John Resig "Search and Don't Replace" .
la source
Une solution concise:
la source
Les solutions proposées jusqu'à présent ne couvrent pas des scénarios plus complexes.
J'avais besoin de convertir une chaîne de requête comme
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
dans un objet comme:
OU:
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
DANS:
J'ai compilé et adapté plusieurs solutions en une seule qui fonctionne réellement:
CODE:
la source
obj=encodeURIComponent(JSON.stringify({what:{ever:','},i:['like']}))
.Ceci est la version simple, vous voudrez évidemment ajouter une vérification des erreurs:
la source
JSON.parse('{"' + decodeURIComponent(query.replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}'));
travaille pour moiname[]=test1&name[]=test2
et il en résulteraname[]=test2
J'ai trouvé $ .String.deparam la solution pré-construite la plus complète (peut faire des objets imbriqués, etc.). Consultez la documentation .
la source
Approche monoplace 2019
Pour votre cas spécifique:
Pour le cas plus générique où quelqu'un veut analyser les paramètres de requête vers un objet:
Si vous ne parvenez pas à utiliser Object.fromEntries, cela fonctionnera également:
la source
[...new URLSearchParams(window.location.search)].reduce((o, i) => ({ ...o, [i[0]]: i[1] }), {});
"http://place.com?foo=bar&hello=%40world&showThing
produit{ hello: "@world", http://place.com?foo: "bar", showThing: "" }
. Essayez d'ajouterstr.split("?").pop()
Une autre solution basée sur la dernière norme d'URLSearchParams ( https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams )
Veuillez noter que cette solution utilise
Array.from ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from )
et _.fromPairs ( https://lodash.com/docs#fromPairs ) de lodash par souci de simplicité.
Il devrait être facile de créer une solution plus compatible puisque vous avez accès à l' itérateur searchParams.entries () .
la source
J'ai eu le même problème, j'ai essayé les solutions ici, mais aucune d'entre elles n'a vraiment fonctionné, car j'avais des tableaux dans les paramètres d'URL, comme ceci:
J'ai donc fini par écrire ma propre fonction JS, qui crée un tableau à partir du paramètre dans l'URI:
la source
if(chunk[0].search("\\[\\]") !== -1) {
celachunk[0]=chunk[0].replace(/\[\]$/,'');
const
plutôt quevar
parce que quelqu'un pourrait le fairecreateObjFromURI = 'some text'
et ensuite il gâcherait le code. si vous utilisezconst
alors quelqu'un qui exécutecreateObjFromURI = 'some text'
fera une erreur ne peut pas assigner de valeur à la variable constante.Utilisation d'ES6, de l'API URL et de l'API URLSearchParams.
la source
ES6 one liner (si on peut l'appeler ainsi en voyant la longue file)
[...new URLSearchParams(location.search).entries()].reduce((prev, [key,val]) => {prev[key] = val; return prev}, {})
la source
cur
pour plus de clarté..reduce((prev, [key, val]) => {prev[key] = val})
Assez facile à utiliser l'
URLSearchParams
API Web JavaScript,Liens utiles
la source
Pour Node JS, vous pouvez utiliser l'API Node JS
querystring
:Documentation: https://nodejs.org/api/querystring.html
la source
Il n'y a pas de solution native à ma connaissance. Dojo a une méthode de désérialisation intégrée si vous utilisez ce framework par hasard.
Sinon, vous pouvez l'implémenter vous-même assez simplement:
edit: ajouté decodeURIComponent ()
la source
Il y a une bibliothèque légère appelée YouAreI.js qui est testée et rend cela vraiment facile.
la source
L'un des moyens les plus simples de le faire à l'aide de l'interface URLSearchParam.
Voici l'extrait de code de travail:
la source
Cela semble être la meilleure solution car elle prend en compte plusieurs paramètres du même nom.
J'ai ensuite décidé de le convertir en plugin jQuery aussi ...
Maintenant, le premier n'acceptera que les paramètres mais le plugin jQuery prendra toute l'URL et retournera les paramètres sérialisés.
la source
En voici un que j'utilise:
Utilisation de base, par exemple.
?a=aa&b=bb
Object {a: "aa", b: "bb"}
Paramètres en double, par exemple.
?a=aa&b=bb&c=cc&c=potato
Object {a: "aa", b: "bb", c: ["cc","potato"]}
Clés manquantes, par exemple.
?a=aa&b=bb&=cc
Object {a: "aa", b: "bb"}
Valeurs manquantes, par exemple.
?a=aa&b=bb&c
Object {a: "aa", b: "bb"}
Les solutions JSON / regex ci-dessus jettent une erreur de syntaxe sur cette URL farfelue:
?a=aa&b=bb&c=&=dd&e
Object {a: "aa", b: "bb", c: ""}
la source
Voici ma version rapide et sale, essentiellement sa division des paramètres URL séparés par «&» en éléments de tableau, puis itère sur ce tableau en ajoutant des paires clé / valeur séparées par «=» dans un objet. J'utilise decodeURIComponent () pour traduire les caractères encodés en leurs équivalents de chaîne normaux (donc% 20 devient un espace,% 26 devient '&', etc.):
exemple:
Retour
Le seul problème est que xyz est une chaîne et non un nombre (en raison de l'utilisation de decodeURIComponent ()), mais au-delà, ce n'est pas un mauvais point de départ.
la source
la source
Babel
l'aide de vous pouvez bien le faire dans un autre environnementUtiliser phpjs
la source
Sur la base de la réponse de Mike Causer, j'ai créé cette fonction qui prend en compte plusieurs paramètres avec la même clé (
foo=bar&foo=baz
) et également des paramètres séparés par des virgules (foo=bar,baz,bin
). Il vous permet également de rechercher une certaine clé de requête.Exemple d'entrée:
foo.html?foo=bar&foo=baz&foo=bez,boz,buz&bar=1,2,3
Exemple de sortie
la source
Si vous utilisez URI.js, vous pouvez utiliser:
https://medialize.github.io/URI.js/docs.html#static-parseQuery
la source
la source
D'ABORD, VOUS DEVEZ DÉFINIR CE QUI EST UN VAR VAR:
Que simplement lire:
et utiliser comme:
la source
Je devais également traiter
+
dans la partie requête de l'URL ( decodeURIComponent ne le fait pas ), j'ai donc adapté le code de Wolfgang pour devenir:Dans mon cas, j'utilise jQuery pour obtenir des paramètres de formulaire prêts pour l'URL, puis cette astuce pour en construire un objet et je peux ensuite facilement mettre à jour les paramètres de l'objet et reconstruire l'URL de la requête, par exemple:
la source
Je le fais de cette façon:
la source
Si vous avez besoin d'une récursivité, vous pouvez utiliser la minuscule bibliothèque js-extension-ling .
Cela produira quelque chose comme ceci:
Remarque: il est basé sur la fonction locutus parse_str ( https://locutus.io/php/strings/parse_str/ ).
la source