首页 > 试题广场 >

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

[编程题]根据包名,在指定空间中创建对象
  • 热度指数:34446 时间限制: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) {
    var pack = sPackage.split('.');
    for(var i=0;i<pack.length;i++){
        if(!oNamespace[pack[i]]){
            oNamespace[pack[i]] ={}; 
        }
        oNamespace = oNamespace[pack[i]];
    }
}
发表于 2015-08-22 15:01:43 回复(4)
        function namespace(oNamespace, sPackage) {
            //将 sPackage 通过.分割成数组
            var arr = sPackage.split('.');
            //遍历数组
            for (var i = 0; i < arr.length; i++) {
                if (arr[i] in oNamespace) {  //如果oNamespace对象中有没有pack[i]属性名
                    if (typeof oNamespace[arr[i]] !== "object") {    //再判断 pack[i]属性值是不是一个对象
                        oNamespace[arr[i]] = {};    // 不是对象类型则将此属性值设为空对象 b:2变成 b:{}           
                    }
                } else {
                    // pack[i]的属性不在对象中,建立此pack[i]的属性,赋值为空对象
                    oNamespace[arr[i]] = {};
                }
                //将oNamespace等于pack[i]的属性值 
                oNamespace = oNamespace[arr[i]];
            }
        }
发表于 2022-04-20 14:56:16 回复(0)
function namespace(oNamespace, sPackage) {
   var list = sPackage.split('.');
    if (list[0] === '') {
        return;
    }
    if (oNamespace[list[0]] instanceof Object) {
        namespace(oNamespace[list[0]], list.slice(1).join('.'));
    } else {
        oNamespace[list[0]] = {};
        namespace(oNamespace[list[0]], list.slice(1).join('.'));
    }
    return oNamespace;
}
发表于 2021-03-09 20:15:58 回复(0)
function namespace(oNamespace, sPackage) {
    let arr=sPackage.split('.');
    let father=oNamespace;
    for(let i in arr){
        if(!father[arr[i]]||typeof father[arr[i]]!=='object')father[arr[i]]={};
        father=father[arr[i]];
    }
    return oNamespace;
}

发表于 2019-11-12 23:15:15 回复(0)
function namespace(oNamespace, sPackage) {
    var package = sPackage.split('.');
    var obj = oNamespace;

    for (var i = 0; i < package.length; ++i) {
        if (typeof obj[package[i]] !== 'object') {
            obj[package[i]] = {};
        }

        obj = obj[package[i]];
    }

    return oNamespace;
}
好久没通宵了。。
发表于 2018-08-26 04:34:05 回复(0)
function namespace(oNamespace, sPackage) {
    var arr = sPackage.split('.');//拆分数组
    var _point = oNamespace;//建立对象引用
    
    while(arr.length > 0){//遍历
        if(Object.prototype.toString.call(_point[arr[0]]) !== '[object Object]'){
            _point[arr[0]] = {};//不是对象就覆盖
        }
        _point = _point[arr[0]]; //重新定位引用
        arr.shift();
    }
    return oNamespace;
}


发表于 2018-08-23 21:47:35 回复(0)
function namespace(oNamespace, sPackage) {  var temp = oNamespace;
 sPackage.split('.').forEach(function(key) {
   // console.log(temp[key])
   if (temp && temp[key] && typeof temp[key] === 'object') {
    temp[key] = temp[key];
   } else {
    temp[key] = {};
   }
   temp = temp[key];
 });
 return oNamespace; 
}

发表于 2017-10-23 09:06:11 回复(0)
function namespace(oNamespace, sPackage) {
    let obj = oNamespace;
    let arr = sPackage.split('.');
    let len = arr.length;
    for(let i=0; i<len; i++) {
        if(arr[i] in obj) continue;
        obj[arr[i]] = {};
        obj = obj[arr[i]];
    }
    return oNamespace;
}

发表于 2020-04-28 17:56:00 回复(0)
function namespace(oNamespace, sPackage) {
    var keys = sPackage.split('.');
    var tempSpace = oNamespace;
    keys.forEach(function(key) {
        if (!(tempSpace[key] instanceof Object)) {
            tempSpace[key] = {};
        }
        tempSpace = tempSpace[key];
    });
    return oNamespace;
}

发表于 2017-08-21 02:26:59 回复(0)
function namespace(oNamespace, sPackage) {
    var p = sPackage.split('.')
    console.log('p is:', p)
    var cp = oNamespace
    for (var i = 0; i < p.length; i++) {
        if (oNamespace[p[i]] === undefined) {
            oNamespace[p[i]] = {}
        }
        oNamespace = oNamespace[p[i]]
    }
    console.log(cp)
}

发表于 2017-03-08 13:19:19 回复(1)
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)
//递归
function namespace(oNamespace, sPackage) {
    var firstPointIndex = sPackage.indexOf('.');
    if(firstPointIndex === -1)
        return oNamespace[sPackage] = {};
    var firstPath = sPackage.slice(0,firstPointIndex);
    if(typeof oNamespace[firstPath] !== 'object')
        oNamespace[firstPath] = {};
    namespace(oNamespace[firstPath], sPackage.slice(firstPointIndex + 1));
    return oNamespace;
}

发表于 2016-08-22 00:04:37 回复(0)
思路:
namespace函数的第一个参数是原始对象,第二个参数是需要创建的对象的包含关系。
通过输出结果可以看出,如果第二个参数中的对象在原始对象中存在并且是它的值为一个对象则不做改变,若不为对象,则重新赋值为空对象{}.
代码如下:
function namespace(oNamespace, sPackage) {
    var properties=sPackage.split(".");
    var parent=oNamespace;
    for(var i=0;i<properties.length;i++){
        var property = properties[i];
        if(Object.prototype.toString.call(parent[property])!== '[object Object]'){
            parent[property] = {};
        }
         parent = parent[property];
    }
    return oNamespace;
}
发表于 2016-08-15 20:52:41 回复(1)
function namespace(oNamespace, sPackage) {
    var names = sPackage.split(/\./);
    var obj = oNamespace;
    console.log(Object.prototype.toString.call(obj) == "[object Object]");
    fullNameSpace(obj,names,0);
    return obj;
}
function fullNameSpace(obj,names,index){
    if(names.length-1==index){
    obj[names[index]] = {};
    }else{
    if(!obj.hasOwnProperty(names[index]) || !(Object.prototype.toString.call(obj[names[index]]) == "[object Object]")){
    obj[names[index]] = {};
    }
    fullNameSpace(obj[names[index]], names , index+1);
    }   
}
编辑于 2016-05-26 12:58:29 回复(0)
这题什么意思,没搞懂
测试通过了,可控制台报错
function namespace(oNamespace, sPackage) {
    var arr=sPackage.split(".");
    for (var i=0,len=arr.length;i<len;i++) {
        if (!oNamespace[arr[i]]) {
            oNamespace[arr[i]]={};
        }
        oNamespace=oNamespace[arr[i]];
    }
    return oNamespace;
}

发表于 2016-08-09 22:30:29 回复(2)
function namespace(oNamespace, sPackage) {
    var arr = sPackage.split('.');
    var res = oNamespace;	// 保留对原始对象的引用

    for(var i = 0, len = arr.length; i < len; i++) {
    	if(arr[i] in oNamespace) {	// 空间名在对象中
    		if(typeof oNamespace[arr[i]] !== "object") {	// 为原始值	
    			oNamespace[arr[i]] = {};    // 将此属性设为空对象			
    		}	
    	} else {	// 空间名不在对象中,建立此空间名属性,赋值为空
    		oNamespace[arr[i]] = {};
    	}
        
    	oNamespace = oNamespace[arr[i]];	// 将指针指向下一个空间名属性。
    }

    return res;

}



方法二:递归
function namespace(oNamespace, sPackage) {
   if(sPackage.length <= 0) return;
    // var arr = sPackage.split('.');
    var pointer = 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 pointer;

}


编辑于 2017-03-20 20:54:48 回复(13)
首先要排除掉原型链上的属性,判断对象自身有没有这个属性,然后再严格判断属性值是否为对象。

所以这些:
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 packNameArr=sPackage.split(".");
    var curObj=oNamespace;
    for(var i=0;i<packNameArr.length;i++){
        if(!curObj.hasOwnProperty(packNameArr[i])){
            curObj[packNameArr[i]]={};
            curObj=curObj[packNameArr[i]];
        }
    }
    return oNamespace;
}

发表于 2015-07-22 23:06:41 回复(6)
56.52%的同学是怎么做的,没明白什么意思额
发表于 2015-07-03 15:30:00 回复(3)
function namespace(oNamespace, sPackage) {
    sPackage.split('.').reduce((pre,cur)=> pre[cur]||(pre[cur]={}), oNamespace);
    return oNamespace;
}
发表于 2020-06-28 18:32:59 回复(1)

问题信息

难度:
146条回答 14896浏览

热门推荐

通过挑战的用户

查看代码