1

J'ai une chaîneConversion d'une chaîne en javascript tableau associatif

string = "masterkey[key1][key2]"; 

Je veux créer un tableau associatif de cela, afin qu'il évalue à:

{ 
    masterkey: { 
    key1: { 
     key2: value 
    } 
    } 
} 

J'ai essayé :

var fullName = string; 
fullName = fullName.replace(/\[/g, '["'); 
fullName = fullName.replace(/\]/g, '"]'); 
eval("var "+fullName+";"); 

Mais je reçois l'erreur: missing ; before statement avec une flèche pointant vers la première tranche dans (Je sais que eval() n'est pas bon à utiliser, donc si vous avez des suggestions, de préférence sans l'utiliser, je l'apprécierais vraiment!

+2

Bienvenue (de retour?) À Stack Overflow! Lorsque vous écriviez votre question, à droite, il y avait une boîte pratique ** Comment formater **, et au-dessus de la zone de texte un bouton ** [?] **. Les deux valent la peine d'être lus. Le quatrième point de la section ** Comment formater ** vous indique comment marquer le code pour qu'il s'affiche correctement. –

+1

FYI: "tableaux associatifs" en Javascript sont des * objets *. Les tableaux ne sont jamais associatifs en Javascript. – deceze

+0

duplication possible de [objets imbriqués Javascript à partir de la chaîne] (http://stackoverflow.com/questions/7640727/javascript-nested-objects-from-string) –

Répondre

4

Pas le plus beau, mais cela a fonctionné pour moi:

var 
    path = "masterkey[key1][key2]", 
    scope = {}; 

function helper(scope, path, value) { 
    var path = path.split('['), i = 0, lim = path.length; 
    for (; i < lim; i += 1) { 
    path[i] = path[i].replace(/\]/g, ''); 

    if (typeof scope[path[i]] === 'undefined') { 
     scope[path[i]] = {}; 
    } 

    if (i === lim - 1) { 
     scope[path[i]] = value; 
    } 
    else { 
     scope = scope[path[i]]; 
    } 
    } 
} 

helper(scope, path, 'somevalue'); 

console.log(scope); 

Démo: http://jsfiddle.net/hR8yM/

+0

+1 Cela semble bien. Peut-être fournir un JSFiddle afin que nous puissions voir que c'est ** en fait tout droit. :) –

+1

@RobertKoritnik Mis à jour;) – Yoshi

0

Maintenant, essayez ceci

string = "masterkey[key1][key2]"; 
var fullName = string; 
fullName = fullName.replace(/\[/g, '[\''); 
fullName = fullName.replace(/\]/g, '\']'); 

document.write("var "+fullName+";"); 
0

1) Lorsque vous utilisez eval, l'argument fourni doit être valide, compléter javascript.

La ligne

var masterkey["key1"]["key2"]; 

est pas javascript valide déclaration. Lorsque vous attribuez une valeur à une variable, vous devez utiliser =. La simple concaténation de certaines valeurs à la fin du nom de la variable ne fonctionnera pas.

2) var masterkey = ["key1"]["key2"] n'a pas de sens. Cela ressemble à une tentative d'assignation de la propriété "key2" de la propriété "key1" de nothing à masterkey.

Si vous voulez que le résultat ressemble à l'exemple que vous donnez, alors c'est ce que vous devez créer. Cela dit, il est préférable d'analyser correctement la chaîne pour créer un objet plutôt que d'utiliser des expressions régulières pour le traduire dans un script à évaluer.

1
function parse(s, obj) { 
    s.match(/\w+/g).reduce(function(o, p) { return o[p] = {} }, obj); 
    return obj; 
} 

console.dir(parse("masterkey[key1][key2]", {})) 
Questions connexes