Existe-t-il un moyen simple (peut-être même une commande simple et simple) de construire une table de hachage (tableau associatif, JSON – peu importe) à partir d’une chaîne comprenant des paires clé-valeur, séparées par un délimiteur donné.
Exemple :
n1=v1&n2=v2&n3=v3
(où &
est un délimiteur) doit renvoyer: [{n1:v1}, {n2:v2}, {n3:v3}]
Exemple 2 :
n1=v1;n2=v2;n3=v3
(où ;
est un délimiteur)
Merci!
Ce qui suit va le faire de manière assez basique et vérifier que la clé dans chaque cas n’est pas vide. Toutes les valeurs seront des chaînes.
function parse(str, separator) { var parsed = {}; var pairs = str.split(separator); for (var i = 0, len = pairs.length, keyVal; i < len; ++i) { keyVal = pairs[i].split("="); if (keyVal[0]) { parsed[keyVal[0]] = keyVal[1]; } } return parsed; }
Exemple:
var props = parse("n1=v1&n2=v2&n3=v3", "&"); alert(props.n2); // Alerts v2
En supposant que vous utilisez un navigateur moderne:
str = "n1=v1&n2=v2&n3=v3" delim = "&" obj = str.split(delim). map(function(s) { return s.split("=") }). reduce(function(p, s) { return p[s[0]] = s[1], p }, {})
carte , réduire
En prime, cela fonctionne aussi très bien lorsque vous travaillez dans un nuage (voir http://en.wikipedia.org/wiki/MapReduce ).
Remarque: cela donne le format spécifié [{n1:'v1'}, {n2:'v2'}]
, et non le format { n1: 'v1', n2: 'v2' }
qui correspondrait mieux à la description de Hashtable . .
Si vous pouvez faire confiance à votre consortingbution en tout autre aspect que le délimiteur, alors cela ressemblerait à ceci:
function splitByDelimiter(input, delimiter) { var parts = input.split(delimiter); var output = []; for(var i = 0; i < parts.length; i++) { var item = {}; var keyValue = parts[i].split('='); item[keyValue[0]] = keyValue[1]; output.push(item); } return output; } splitByDelimiter('n1=v1;n2=v2;n3=v3', ';')
var stuff = "n1=v1&n2=v2&n3=v3".split("&"), moreStuff = [], hashStuff = {}, i = 0, l = stuff.length; for (;i
Mon essai, pas efficace 🙁
query = 'n1=v1&n2=v2&n3=v3'.split('&') obj = {} $.each(arr,function(k,v){ key = v.split('=')[0] value = v.split('=')[1]; obj[key] = value; }) obj.n1 outputs v1
var str = "n1=v1&n2=v2&n3=v3"; var arr = eval('[{' + str.replace(/=/g, ':"').replace(/&/g, '"},{') + '"}]');
ou si vous ne préférez pas eval
var arr = jQuery.parseJSON('[{"' + str.replace(/=/g, '":"').replace(/&/g, '"},{"') + '"}]')
Expressions régulières.
Voir ce résumé sur http://www.regular-expressions.info/javascript.html (section Regexp Methods de la classe Ssortingng ):
L’utilisation de la méthode split () d’une chaîne vous permet de scinder la chaîne en un tableau de chaînes à l’aide d’une expression régulière pour déterminer les positions auxquelles la chaîne est fractionnée. Par exemple, myArray = mySsortingng.split (/, /) divise une liste délimitée par des virgules en un tableau. Les virgules elles-mêmes ne sont pas incluses dans le tableau de chaînes résultant.
MODIFIER
Vous pouvez également vous référer à cette autre question: Analyser la chaîne de requête en JavaScript
Pas ‘facile’ comme dans ‘intégré’, mais …
var myQuerySsortingng = "n1=v1&n2=v2&n3=v3"; var delim = '&'; var vars = myQuerySsortingng.split(delim); var parsed = {}; for (var i=0; i
Le résultat est en cours d' parsed
.
function parseStr2Map(str) { var elems = str.split("&"); var map = {}; for (var i = 0; i < elems.length; i++) { var nvPair = elems[i].split("="); map[nvPair[0]] = nvPair[1]; } return map; }
C'est sans erreur. Si vous voulez parsingr location.search, vous devez faire le décodage ...
var input = 'n1=v1&n2=v2&n3=v3'; var tokens = input.split('&'); var hashTable = {}; for (var i = 0; i < tokens.length; i++) { var keyValuePair = tokens[i].split('='); var key = keyValuePair[0]; var value = keyValuePair[1]; hashTable[key] = value; } alert(JSON.stringify(hashTable));