题目描述
根据包名,在指定空间中创建对象
输入描述:
namespace({a: {test: 1, b: 2}}, 'a.b.c.d')
输出描述:
{a: {test: 1, b: {c: {d: {}}}}}
理解题意
命名空间
命名空间是一种代码封装技术,代码中的每个成员,都是自己的活动空间,彼此互不干扰。
首先理解题意,namespace($1, $2)函数中第一个参数是现有命名空间中的对象,而第二个参数是需要此空间实现的结构(即对象的包含关系),可知是a包含b包含c包含d;
解题思路
首先因为题目所要求创建的空间是顺序的,所以直接通过循环,将其一个个创建即可。
当空间中包含对象时(如a:{test:1})则保留此对象;当包含内容不是对象时(如b:2),则将其设置为一个空对象。如果不包含此空间名,则在其上一级空间中创建一个空对象。
代码
function namespace(oNamespace, sPackage) {
var res = oNamespace; //保存当前空间名
var arr = sPackage.split('.'); //得到[a,b,c,d]
//开始循环空间名并进行创建对象的操作
for(var i = 0 , len = arr.length; i < len; i++){
//如果arr[i]存在于当前空间中
if(arr[i] in oNamespace){
//使用typeof判断空间中的这个属性是否是个对象,如果不是设为空对象
if(typeof oNamespace[arr[i]] !== "object"){
oNamespace[arr[i]] = {};
}
//如果是个对象则保留原值
}
//如果不在当前空间中则创建为一个空对象
else{
oNamespace[arr[i]] = {};
}
//指向下一个空间进行下一次循环
oNamespace = oNamespace[arr[i]];
}
//循环完成后输出结果
return res;
}
易错点
- 因为arr[i]是自己定义的变量,而不是对象中的属性,通过变量访问属性时需要用方括号法,不能使用点表示法
- 判断此元素在空间中后,则操作空间中的这一元素。直接对arr[i]进行处理时不对的
JS命名空间的概念
请参考这篇,简介易懂
简书