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'