2010-02-22 123 views
2

我試圖編寫一個函數,它需要一個表示名稱空間的字符串(例如「MyCompany.UI.LoginPage」),並將名稱空間的每個段定義爲對象已經不存在了。例如,如果「MyCompany.UI.LoginPage」不是一個對象,它會評估這個:從'命名空間'字符串構建對象層次結構

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

我想通過枚舉「命名空間」的每個字符來做到這一點(串)參數和定義作爲枚舉的每個對象都達到句點字符。

如何枚舉JavaScript中的字符串的字符?

回答

1

將字符串轉換爲字符數組,此代碼:

var $letterArray = []; 

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

然後你就可以在每一個字符枚舉字符串數組中$letterArrary

+1

有足夠的美元符號呢? – icktoofay 2010-02-22 05:07:30

+0

我認爲使用'substring'獲取只有一個字符是非常昂貴的,當我們有'charAt'方法。 – CMS 2010-02-22 05:09:00

+0

歡迎@Chris,JFTR將字符串轉換爲單字符字符串數組,也可以使用帶空字符串參數的split方法,例如:''foo「.split(」「);'會給你一個看起來像這樣的數組:'[「f」,「o」,「o」]' – CMS 2010-02-22 05:36:33

4

您可以直接訪問字符串的字符,它的指數使用String.prototype.charAt方法:

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

但我不認爲你要遍歷您命名空間字符串逐個字符,你可以使用String.prototype.split方法,來獲得使用點包含命名空間層次陣列(.)爲分隔符,如:

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

不過我覺得你的問題去進一步此,我會給你一個更先進的出發點,我做了一個遞歸函數,可以讓你做你想要什麼,使用字符串初始化幾個嵌套的對象層次:

使用方法:

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', {}); 

實現:

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 
} 

你將不得不提高該功能,例如,你將需要消毒串...

+0

我建議改變'obj [first] = {};'爲'obj [first] = obj [first] || {};',所以你不會覆蓋現有的子空間 – 2010-02-22 05:15:35

+0

+1 @CMS,我更喜歡你的方法,效率更高。 – 2010-02-22 05:26:20

+0

@Chris:謝謝!,@K Prime:是的,很好的建議,我會在一分鐘內應用它... – CMS 2010-02-22 05:29:10