0

我发现自己正在为一个小问题而苦苦挣扎。假设我有一个对象:

var foo = {
    bar: {
        baz: true
    }
};

现在我也有一个 String 'foo.bar.baz'。我现在想使用字符串从对象中检索值。

请注意:这只是一个示例,解决方案需要是动态的。

更新:

我还需要变量名是动态的并从字符串中解析出来。我也不能确定我的变量是窗口的属性。

我已经使用 构建了一个解决方案eval,但我认为这很难看:http: //jsfiddle.net/vvzyX/

4

4 回答 4

4

例如,

function get(obj, path) {
    return path.split('.').reduce(function(obj, p) {
        return obj[p]
    }, obj);
}

演示:

tree = {
    foo: {
        bar: 1,
        baz: { quux: 3 },
    },
    spam: 1
}

console.log(get(tree, 'foo.baz.quux')) // 3
于 2013-01-17T09:27:25.570 回答
2

您可以这样做:

function getValue(namespace, parent) {
    var parts = namespace.split('.'),
        current = parent || window;
    for (var i = 0; i < parts.length; i += 1) {
        if (current[parts[i]]) {
            current = current[parts[i]];
        } else {
          if (i >= parts.length - 1)
            return undefined;
        }
    }
    return current;
}
var foo = {
    bar: {
        baz: true
    }
};
console.log(getValue('foo.bar.baz')); //true

函数的第一个参数是命名空间(点分隔值),第二个参数是parent对象,如果没有提供 parent,则window使用。

使用 parent 参数的另一个示例:

var str = 'foo.bar.baz';
    foo = {
       bar: {
          baz: true
       }
    };

result = getValue(str, foo);
console.log(result);

这是jsfiddle中的一个示例。

YUI 中使用了类似的方法。他们的方法被称为命名空间模式。主要好处是模拟包/命名空间。这个脚本和命名空间模式的唯一区别是命名空间函数创建嵌套结构而不是只返回值。

于 2013-01-17T09:27:11.867 回答
2

试试这个:

var name = [window].concat('foo.bar.baz'.split('.')).reduce(function(prev, curr) {
    return prev[curr];
});

console.log(name);

// -> 'true'
于 2013-01-17T09:27:30.017 回答
0

我能想到的是首先使用字符串拆分将该字符串拆分为一个数组,然后通过[]循环访问该对象的属性来访问该对象

于 2013-01-17T09:26:58.673 回答