第一种解法:递归
// 逻辑过程
// 遍历传进的对象中有哪些属性 每次把找到的属性去数组中找 找到了就创建对象 没找到就遍历下个属性
// 是不是数组的最后一个元素
// 如果不是 就截取未遍历的部分 递归调用
// 第一次 namespace({a: {test: 1, b: 2}}, 'a.b.c.d')
// 字符串长度小于等于1吗 不 拆成数组 取arr[0]中的a 再把arr[0]=空字符串
// 遍历{a: {test: 1, b: 2}}对象 有a属性吗? 有a属性 a属性是对象吗 是 把未检验的字符串截取出来 对a递归调用
// 第二次 namespace(a: {test: 1, b: 2}, 'b.c.d')
// 字符串长度小于等于1吗 不 拆成数组 取arr[0]中的b 再把arr[0]=空字符串
// 遍历a: {test: 1, b: 2}对象 有b属性吗? 有b属性 b属性是对象吗 不是 等于一个空对象
// 把未检验的字符串截取出来 对b递归调用
// 第三次 namespace(b:{}, 'c.d')
// 字符串长度小于等于1吗 不 拆成数组 取arr[0]中的c 再把arr[0]=空字符串
// 遍历b:{}对象 有c属性吗? 没有c属性 等于一个空对象 把未检验的字符串截取出来 对a递归调用
// 第四次 namespace(c:{}, 'd')
// 字符串长度小于等于1吗 对 c.d={} return c
代码:
function namespace(oNamespace, sPackage) {
if (sPackage.length <= 1) {
oNamespace[sPackage] = {}
return oNamespace
}
let arr = sPackage.split(".")
if (typeof oNamespace[arr[0]] != "object") {
oNamespace[arr[0]] = {}
}
oNamespace[arr[0]] = namespace(oNamespace[arr[0]], sPackage.slice(2))
return oNamespace
}
第二种解法
// 拆成数组以后 遍历数组
// 通过一个临时变量存放当前被遍历到的元素
// 如果不是对象或者没有这个属性 就创建一个空对象给该属性
代码:
function namespace(oNamespace, sPackage) {
let arr = sPackage.split(".")
let tmp = oNamespace
// k是下标
for (let k in arr) {
// 如果当前对象没有这个属性 就等于一个空对象
if (typeof tmp[arr[k]] !== "object") {
tmp[arr[k]] = {}
}
// 把临时对象变为 遍历到的的对象
tmp = tmp[arr[k]]
// 下次遍历就看这个临时对象里有没有被遍历到的属性
}
}