2013-07-11 4 views

Répondre

2

Vous pouvez le faire avec regex:

var vars = {}; 
myString.replace(/(\D+)(\d+)/g, function(_,k,v){ vars[k] = +v }); 

console.log(vars); //=> {s: 1, a: 174, o: 10} 
+1

mmm ... en utilisant 'replace' pour quelque chose qui n'est pas un remplacement? Cela tombe dans le trop méchant d'un hack pour moi .... –

+0

'remplacer' pour boucler les correspondances est une pratique courante dans mon livre ... Je trouve le motif' while (affectation) 'plus difficile à lire TBH. – elclanrs

+0

Je suis d'accord que l'affectation dans le 'while' peut être source de confusion. Même si c'est assez commun, je reste aussi loin de ça. Je préférerais quelque chose comme 'var correspond à = myString.match (/ (\ D +) (\ d +)/g)'; 'pour (var i = 1; i

5

Vous pouvez utiliser une expression régulière:

var ITEM = /([a-z])(\d+)/g; 

ensuite mis chaque match dans un objet:

var result = {}; 
var match; 

while(match = ITEM.exec(myString)) { 
    result[match[1]] = +match[2]; 
} 

Maintenant vous pouvez utiliser result.s, result.a, et result.o.

+1

+1 En voici un exemple en action http://jsfiddle.net/2YL3z/ –

0

Regex peut vous aider ...

var myString = "s1a174o10"; 
var matches = myString.match(/([a-zA-Z]+)|(\d+)/g) || []; 

for(var i = 0; i < matches.length; i+=2){ 
    window[matches[i]] = matches[i+1]; 
} 

AVERTISSEMENT: s, a, o sera mondiale ici. Si vous le souhaitez, vous pouvez déclarer un objet au lieu d'utiliser window ici.

+0

Cela fonctionne pour la chaîne donnée, mais la réponse de minitech est plus robuste car elle fonctionnera pour les chaînes qui ne sont pas exactement de ce format, comme "24a1b2c3". C'est parce que son RegEx attend un nombre après un caractère, où le tien suppose qu'il commence par une chaîne. Voir http://jsfiddle.net/2YL3z/2/ –

Questions connexes