题目描述
根据包名,在指定空间中创建对象
输入描述:
namespace({a: {test: 1, b: 2}}, ‘a.b.c.d’)
输出描述:
{a: {test: 1, b: {c: {d: {}}}}}
第一种常规:
function namespace(oNamespace, sPackage) {
var arr = sPackage.split(".");
var str = oNamespace;
for(var i=0;i<arr.length;i++){
if(arr[i] in oNamespace){
if(typeof oNamespace[arr[i]] !== 'object'){
oNamespace[arr[i]] = {};
}
} else {
oNamespace[arr[i]] = {};
}
oNamespace = oNamespace[arr[i]];
}
return str;
}
var oNamespace = {a: {test: 1, b: 2}};
var sPackage = 'a.b.c.d';
console.log(namespace(oNamespace, sPackage));
第二种递归:
function namespace(oNamespace, sPackage) {
if(sPackage.length <= 0){
return 0;
}
var str = oNamespace;
if(sPackage[0] in oNamespace){
if(typeof oNamespace[sPackage[0]] !== 'object'){
oNamespace[sPackage[0]] = {};
}
} else {
oNamespace[sPackage[0]] = {};
}
oNamespace = oNamespace[sPackage[0]];
namespace(oNamespace, sPackage.slice(2));
return str;
}
var oNamespace = {a: {test: 1, b: 2}};
var sPackage = 'a.b.c.d';
console.log(namespace(oNamespace, sPackage));
思路:利用了对象浅拷贝的特点,然后抽出sPackage
的每一部分,去找oNamespace
对应部分,如果存在就将其变为对象,如果不存在,那么就加入其中,当然也是对象的格式,上述方法实现不同之处在于,一个使用for循环来以此判断,另一个则借助递归来实现遍历。
PS:这题目描述。。。。