Javascript 解析对象点符号以检索对象的值

Javascript 解析对象点符号以检索对象的值,javascript,Javascript,我发现自己在与一个小问题作斗争。 假设我有一个对象: var foo = { bar: { baz: true } }; 现在我还有一个字符串'foo.bar.baz'。现在我想使用字符串从对象中检索值 请注意:这只是一个示例,解决方案需要是动态的 更新: 我还需要变量名是动态的,并从字符串中解析。我也不能确定我的变量是窗口的属性 我已经使用eval构建了一个解决方案,但我认为这相当难看: 我能想到的是使用string split首先将该字符串拆分为一个数组,然

我发现自己在与一个小问题作斗争。 假设我有一个对象:

var foo = {
    bar: {
        baz: true
    }
};
现在我还有一个字符串'foo.bar.baz'。现在我想使用字符串从对象中检索值

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

更新:

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

我已经使用eval构建了一个解决方案,但我认为这相当难看:

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

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
下面是一个例子

YUI中也使用了类似的方法。他们的方法称为名称空间模式。主要的好处是模拟包/名称空间。此脚本与名称空间模式之间的唯一区别在于,名称空间函数创建嵌套结构,而不是仅返回值。

例如

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

试试这个:

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

console.log(name);

// -> 'true'

@哈哈,不!请看我的答案。@Amberlamps:我不能确定我的变量是Window的一个属性,这很好。我已经将其改编为用于角型项目代表团:谢谢,这是缺失的部分。变量只能在父范围或全局范围内。有趣的是,我无法使它正常工作,不知何故,prev[curr]不被接受:您没有使用我的原始代码。您的代码示例中缺少[window].concat[…]。这是从您的示例复制粘贴的,在Chrome中仍然不好:JSFIDLE在本地范围内运行其代码,因此foo不是全局的。因此,窗口[foo]未定义。此代码仅在对象可全局访问时有效。@primavera133:谢谢:
tree = {
    foo: {
        bar: 1,
        baz: { quux: 3 },
    },
    spam: 1
}

console.log(get(tree, 'foo.baz.quux')) // 3
var name = [window].concat('foo.bar.baz'.split('.')).reduce(function(prev, curr) {
    return prev[curr];
});

console.log(name);

// -> 'true'