2011-04-13 5 views
4

J'ai vu quelques questions connexes et google résultats, mais aucun ne semble correspondre à mon problème.Chaîne Javascript à la référence d'objet (sans eval() ou index)

Je reçois une chaîne "header.h2" que je veux utiliser pour "var objects". Donc, je veux objects.header.h2 (qui contient plus de données de hachage).

Cependant, je ne veux pas utiliser eval() ou suggéré souvent buttons[] pour la raison évidente que buttons[header.h2] ne fonctionnera pas et je aurais besoin buttons[header][h2].

Alors, comment puis-je rester la notation d'objet, ou dans le pire des cas, résoudre mon problème?

Répondre

8

Juste une esquisse rapide d'une façon possible:

Vos données:

var data = [ 
    {foo: 1, bar: 2, foobar: [ 
     'a', 'b', 'c' 
    ]}, 
    {foo: 1, bar: 2, foobar: [ 
     'd', 'e', 'f' 
    ]}, 
    {foo: 1, bar: 2, foobar: [ 
     'g', 'h', 'i' 
    ]} 
]; 

var accessor = '1.foobar.2'; 

en utilisant une fonction d'aide:

function helper(data, accessor) { 
    var keys = accessor.split('.'), 
     result = data; 

    while (keys.length > 0) { 
     var key = keys.shift(); 
     if (typeof result[key] !== 'undefined') { 
      result = result[key]; 
     } 
     else { 
      result = null; 
      break; 
     } 
    } 

    return result; 
} 

Ou le rendre accessible à tous objets: (personnellement, je n'aime pas ça ...)

Object.prototype.access = function (accessor) { 
    var keys = accessor.split('.'), 
     result = this; 

    while (keys.length > 0) { 
     var key = keys.shift(); 
     if (typeof result[key] !== 'undefined') { 
      result = result[key]; 
     } 
     else { 
      result = null; 
      break; 
     } 
    } 

    return result; 
}; 

La sortie de débogage:

console.log(
    helper(data, accessor), // will return 'f' 
    data.access(accessor) // will return 'f' 
); 
+0

Donc, diviser sur le point, puis itérer à travers eux et les placer dans un tableau multidimensionnel? Cela semble bon! –

3

Je voudrais créer une méthode "remplir" qui crée l'objet par la chaîne de notation de points est donné:

var populate = function(obj, str) { 
    var ss=str.split(/\./), len=ss.length, i, o=obj; 
    for (i=0; i<len; i++) { 
    if (!o[ss[i]]) { o[ss[i]] = {}; } 
    o = o[ss[i]]; 
    } 
    return obj; 
}; 

var objects = populate({}, 'header.h2'); 
objects.header.h2; // => Object {} 
populate(objects, 'foo.bar.gah.zip'); 
objects.foo.bar.gah.zip; // => Object {} 

évaluation des besoins, mais devrait vous rapprocher de votre objectif.

Questions connexes