使用命名空间/键搜索对象

时间:2013-07-08 05:04:38

标签: javascript object namespaces

我正在尝试编写一个可以在JavaScript对象中查找命名空间和值并返回密钥的函数。

想象一下这个数据:

var o = {

    map: {
        lat : -33.86749,
        lng : 151.20699,
        zoom : 12
    },

    filters : {
        animals : {
            dogs: {
                myDog : 'fido'
            }
        }
    }
};

function get(namespace, key){
    //TODO
}

get('filters.animals.dogs', 'myDog')

如何构建一个动态执行此操作的函数 - 无论命名空间的深度如何?

这个函数有点接近,只是它修改了我们不想要的原始对象:

var get = function(obj, namespace, key, value) {

    var parts = namespace.split('.');

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

        obj = obj[parts[i]];
    }

    return obj[key] = value;
};

疯狂的原因是我无法暴露这个物体。它必须保持私密,公共方法必须吐出结果。

2 个答案:

答案 0 :(得分:3)

试一试。

function get(namespace, key) {
    var parts = namespace.split('.'),
        i = 0,
        l = parts.length,
        obj = o;
    while ( i < l ) {
        obj = obj[parts[i]];
        if ( ! obj ) break;
        i++; 
    }
    return obj && obj[key] ? obj[key] : null;
}

答案 1 :(得分:0)

我创造了一个工作代码的小提琴。希望有所帮助。

http://jsfiddle.net/RdhJF/2/

var o = {

    map: {
        lat : -33.86749,
        lng : 151.20699,
        zoom : 12
    },

    filters : {
        animals : {
            dogs: {
                myDog : 'fido'
            }
        }
    }
};




function get(obj, namespace) 
{
    var parts = namespace.split('.');

    if(parts.length==0)
        return -1;


    var previousValue = obj;

    for(var i = 0; i < parts.length; i++) 
    {
        if(typeof previousValue[parts[i]] == 'undefined')
            return -1;
        else
            previousValue = previousValue[parts[i]];

    }

    return previousValue;
}

var myValue= get(o,'filters.animals.dogs.myDog');
alert(myValue);