2010-02-22 10 views
2

J'essaye d'écrire une fonction qui prend une chaîne représentant un espace de noms (par exemple "MyCompany.UI.LoginPage") et définit chaque segment de l'espace de noms comme un objet s'il ne le fait pas n'existe pas déjà. Par exemple, si « MyCompany.UI.LoginPage » était pas un objet, il évaluerait ceci:Construction d'une hiérarchie d'objets à partir d'une chaîne 'namespace'

MyCompany = {}; 
MyCompany.UI = {}; 
MyCompany.UI.LoginPage = {}; 

je voudrais faire en dénombrant chaque caractère de l'argument « espace de noms » (chaîne) et définissant chaque objet lorsque l'énumération atteint les caractères de période.

Comment puis-je énumérer les caractères d'une chaîne en JavaScript?

Répondre

1

Convertir la chaîne en un tableau de caractères avec ce code:

var $letterArray = []; 

for (var $i = 1; $i <= $yourString.length; $i++) 
{ 
    $letterArray[$i] = $yourStringtring.substring(($i - 1), $i); 
} 

Ensuite, vous pouvez énumérer sur chaque personnage dans le tableau de chaînes $letterArrary

+1

assez des signes dollar est arrivé là? – icktoofay

+0

Je pense qu'utiliser 'substring' pour obtenir un seul caractère est assez cher quand on a la méthode' charAt'. – CMS

+0

Vous êtes les bienvenus @Chris, JFTR pour convertir une chaîne en un tableau de chaînes d'un caractère, vous pouvez également utiliser la méthode 'split' avec un argument de chaîne vide, par exemple:' "foo" .split (""); ' vous donnera un tableau qui ressemble à: '[" f "," o "," o "]' – CMS

4

Vous pouvez accéder aux caractères d'une chaîne directement par son index, en utilisant la méthode String.prototype.charAt:

var str = "foo"; 
for (var i = 0; i < str.length; i++) { 
    alert(str.charAt(i)); 
} 

Mais je ne pense pas que vous voulez parcourir votre chaîne d'espace de noms caractère par caractère, vous pouvez utiliser la méthode String.prototype.split, pour obtenir un tableau contenant les niveaux d'espace de noms en utilisant le point (.) comme séparateur, par exemple:

var levels = "MyCompany.UI.LoginPage".split('.'); 
// levels is an array: ["MyCompany", "UI", "LoginPage"] 

Mais je pense que votre question va plus à cela, et je vais vous donner un point de départ plus avancé, j'ai fait une fonction récursive qui vous permettra de faire exactement ce que vous voulez, initialiser plusieurs niveaux d'objets imbriqués en utilisant une chaîne:

Utilisation:

initializeNS('MyCompany.UI.LoginPage'); 
// that will create a MyCompany global object 

// you can use it on an object to avoid globals also 
var topLevel = {}; 
initializeNS('Foo.Bar.Baz', topLevel); 

// or 
var One = initializeNS('Two.Three.Four', {}); 

Mise en œuvre:

function initializeNS(ns, obj) { 
    var global = (function() { return this;})(), // reference to the global object 
     levels = ns.split('.'), first = levels.shift(); 
    obj = obj || global; //if no object argument supplied declare a global property 
    obj[first] = obj[first] || {}; // initialize the "level" 
    if (levels.length) { // recursion condition 
    initializeNS(levels.join('.'), obj[first]); 
    } 
    return obj[first]; // return a reference to the top level object 
} 

Vous devrez améliorer cette fonction, par exemple, vous devrez désinfectez la chaîne ...

+0

Je suggère de changer 'obj [first] = {};' à 'obj [first] = obj [premier] || {}; ', donc vous n'écrasez pas les sous-espaces existants –

+0

+1 @CMS, j'aime mieux votre méthode, beaucoup plus efficace. –

+0

@Chris: Merci !, @K Prime: Oui, bonne suggestion, je vais l'appliquer dans une minute ... – CMS