3

我正在尝试编写一个函数,该函数可以在 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;
};

疯狂的原因是我无法暴露对象。它必须保持私有,并且公共方法必须输出结果。

4

2 回答 2

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;
}
于 2013-07-08T05:11:39.753 回答
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);
于 2013-07-08T05:22:40.973 回答