Comment parsingr une chaîne dans une table de hachage

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