2010-02-22 98 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