2010-03-26 7 views
0

Étant donné je ce qui suit: (ce qui est généré dynamiquement et varie en longueur)formage dynamiquement une Traversion objet JSON sans utiliser eval

associations = ["employer", "address"];

Essayer de traverser l'objet JSON, et désireux de former quelque chose comme ce qui suit:

data.employer.address 

ou

data[associations[0]][association[1]]

Sans cela:

eval("data."+associations.join('.'));

Enfin, je peux être boudé pour dire cela, mais est-il correct d'utiliser eval dans une instance comme celui-ci? Juste récupérer des données.

Répondre

1

Pourquoi ne pas simplement parcourir vos associations?

function traverse(data, associations){ 
    for (var i=0; i<associations.length; i++){ 
     data = data[associations[i]]; 
    } 
    return data; 
} 

Votre méthode eval doit générer une nouvelle chaîne et analyser le code avant même de commencer à le parcourir.

+0

C'est parfait, merci. Tout ce qui fait allusion à la récursivité frémit habituellement mon cerveau. –

+0

En fait, l'itération simple sera beaucoup plus rapide (en Javascript) que la récursion ou la réduction/pliage fonctionnelle. – z5h

0

Voici une façon d'utiliser Prototype.

$A(associations).inject(data, function (obj, method) { 
    return obj[method]; 
}); 

L'utilisation eval est très bien si vous pouvez garantir que l'utilisateur ne pourra pas affecter la chaîne vous passez à elle. Si votre entrée provient de l'utilisateur ou d'une URL qui pourrait être modifiée par l'utilisateur, vous devriez probablement éviter eval.

0

Vous pouvez toujours créer un noeud de script dynamique. Par exemple:

var yo = document.createElement("script"); 
yo.setAttribute("type", "text/javascript"); 
yo.innerHTML = "alert('yo!');"; 
document.body.appendChild(yo); 

Aucun résultat requis.