首页 > 试题广场 >

根据包名,在指定空间中创建对象

[编程题]根据包名,在指定空间中创建对象
  • 热度指数:34489 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
根据包名,在指定空间中创建对象

输入描述:
namespace({a: {test: 1, b: 2}}, 'a.b.c.d')


输出描述:
{a: {test: 1, b: {c: {d: {}}}}}
function namespace(oNamespace, sPackage) {
    let res = oNamespace;
    let tempArr = sPackage.split('.');
    for (let i = 0; i < tempArr.length; i++) {
        //如果空间中的该包不是对象,则将其赋值为对象
        if (!(res[tempArr[i]] instanceof Object)) {
            res[tempArr[i]] = {};
        } 
        //如果该包是对象或将其赋值为对象后,将空间更新为该包,进入该包的内部继续执行
        res = res[tempArr[i]]
    }
    return res;
}
发表于 2021-05-30 16:58:39 回复(0)
function namespace(oNamespace, sPackage) {
    if(!(sPackage instanceof Array)){
        var keys = sPackage.split(".")
    }
    
    var tmpNamespace = oNamespace
    for (let index in keys) {
        const key = keys[index]
        console.log(oNamespace)
        console.log(tmpNamespace)
        if(!tmpNamespace[key]){
            tmpNamespace[key] = {}
        }
        tmpNamespace = tmpNamespace[key]
    }
}
js中的浅拷贝可以操作地址从而改变变量的值

发表于 2021-03-31 14:42:32 回复(0)
function namespace(oNamespace, sPackage) {
const arr = sPackage.split('.')
let current = oNamespace
let i = 0
while(i< arr.length) {
current[arr[i]] = current[arr[i]] && Object.prototype.toString.call(current[arr[i]]) === "[object Object]" ? current[arr[i]] : {}
current = current[arr[i]]
i += 1
}
return oNamespace
}
编辑于 2021-03-27 23:29:38 回复(0)
function namespace(oNamespace, sPackage) {
    let obj = oNamespace;
    let pkgs = sPackage.split('.');
    pkgs.reduce((preObj, key)=>{
        if (!preObj[key]) preObj[key] = {};
        return preObj[key];
    }, obj);
    return obj;
}

发表于 2021-03-26 17:16:56 回复(0)
    function namespace(oNamespace, sPackage) {
      sPackage = sPackage.split('.')
      let key = sPackage.shift() // 每次都获得第一个key
      if (!key) { // 当获得的key为空时,即为终止条件
        return
      }
      if (!oNamespace.hasOwnProperty(key)) { // 如果不存在该属性,则创建
        oNamespace[key] = {}
      }
      namespace(oNamespace[key], sPackage.join('.')) // 递归
      return oNamespace
    }

编辑于 2021-03-07 17:08:21 回复(0)
想都不用想呀,直接递归
        function namespace(oNamespace, sPackage) {
            if (sPackage.length > 1) {
                sPackage = sPackage.split('.');
                var obj = oNamespace;
                for (let i = 0; i < sPackage.length; i++) {
                    obj = namespace(obj, sPackage[i]);
                };
                return oNamespace;
            };
            if (!oNamespace[sPackage] || oNamespace[sPackage] instanceof Array || typeof oNamespace[sPackage] != 'object') {
                oNamespace[sPackage] = {};
            };
            return oNamespace[sPackage];
        };


发表于 2021-01-09 23:59:14 回复(0)
function namespace(oNamespace, sPackage) {
    const arr = sPackage.split('.')
    arr.forEach(key => {
        if (!oNamespace[key]) {
            oNamespace[key] = {}
        }
        oNamespace = oNamespace[key]
    })
}
参考 vue 源码的写法😅
发表于 2020-11-15 23:40:35 回复(0)
function namespace(oNamespace, sPackage) {
    let keys = sPackage.split('.')
    let temp = oNamespace
    keys.forEach(k =>{
        if( (k in temp)==false) {
            temp[k] = {}
            temp = temp[k]
        }
    })
    return oNamespace
}

发表于 2020-11-03 15:28:18 回复(0)
function namespace(oNamespace, sPackage) {
    let abcd = sPackage.split('.');
	let obj=oNamespace;
    abcd.forEach(x => {
		if(typeof(obj[x])!='object'){obj[x]={};}
		obj=obj[x];
	});
    return oNamespace;
}
typeof(obj[x])!='object'即判断了是否含有x属性,也判断了x属性的值是否是对象
发表于 2020-03-29 16:27:38 回复(1)
function namespace(oNamespace, sPackage) {
    let pArr = sPackage.split('.')
    let obj=oNamespace;
    for(p of pArr){
        if(Object.prototype.toString.call(obj[p]).slice(8,-1)!=='Object'){
           obj[p] = {}
        }
        obj = obj[p]
    }
    return oNamespace
}

发表于 2020-03-18 18:03:11 回复(0)
function namespace(oNamespace, sPackage) {
    var obj = oNamespace
    sPackage.replace(/(\w+)\.?/g,function(s,k){
        obj = Object.prototype.toString.call(obj[k])==='[object Object]'?obj[k]:(obj[k] = {})
    })
    return oNamespace
}

发表于 2019-01-21 17:18:38 回复(0)
function namespace(oNamespace, sPackage) {
    var arr=sPackage.split(".");
    var rs=oNamespace;
    for(var i=0;i<arr.length;i++){
        if(!(arr[i] in oNamespace)){
			oNamespace[arr[i]] = {};
        }
        oNamespace = oNamespace[arr[i]];
    }
    return rs;
}

发表于 2017-09-12 17:47:32 回复(0)
首先要排除掉原型链上的属性,判断对象自身有没有这个属性,然后再严格判断属性值是否为对象。

所以这些:
if (!ns[scope[i]] ...) {...}

if (!(scope[i] in ns) ...) {...}

if (typeof ns[scope[i]] != 'object' ...) {...}

if (!(ns[scope[i]] instanceof Object) ...) {...}
都是错的。

而包名字符串是简单顺序的,所以可以直接 split 出来遍历,利用引用赋值的特性逐级跟进到包里面(可以把遍历用的 ns 想象成指针):
function isPlainObject(value) {
    return Object.prototype.toString.call(value).slice(8, -1) == 'Object';
}

function namespace(oNamespace, sPackage) {
    var scope = sPackage.split('.');
    var ns = oNamespace;
    for (var i = 0; i < scope.length; ++i) {
        if (!ns.hasOwnProperty(scope[i]) || !isPlainObject(ns[scope[i]])) {
            ns[scope[i]] = {};
        }
        ns = ns[scope[i]];
    }
    return oNamespace;
}

编辑于 2017-09-13 04:11:37 回复(0)
function namespace(oNamespace, sPackage) {
var obj=oNamespace;
sPackage.replace(/([^\.])(\.|)/g,function(t,m){
//如果obj[m]是对象的话,返回自身,不是则返回空对象
//将obj[m]赋给obj,下一次的obj就可以指向本次的obj[m]了
obj=obj[m]=obj[m] instanceof Object?obj[m]:{}
})
return oNamespace;
}

编辑于 2017-03-14 10:17:23 回复(1)