在这里,我只能使用字符串,因此我还必须从字符串中检索对象的值,简而言之:
从我们编写的对象中检索值:
someObject.property1.name // for say
但就我而言,我想使用字符串从对象中检索值,即
'someObject.property1.name' // for say
因为我不太有信心自己能做到这一点,所以我更喜欢在互联网上搜索,我得到的最合适的解决方案是
#1
Object.byString = function(o, s) {
s = s.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
s = s.replace(/^\./, ''); // strip a leading dot
var a = s.split('.');
while (a.length) {
var n = a.shift();
if (n in o) {
o = o[n];
} else {
return;
}
}
return o;
}
来自here
#2
var deep_value = function(obj, path){
for (var i=0, path=path.split('.'), len=path.length; i<len; i++){
obj = obj[path[i]];
};
return obj;
};
来自here
但正如我所说,它们是最合适的示例,因为它们都采用一个额外参数,即 obj
、O
等等...这给我,所以我尝试改进搜索2中的上述代码,因为它很紧凑,但这导致了失败。该代码是:
var obj = {
foo: { bar: 'baz' }
};
var deep_value = function(path){
var obj = path.split('.');
obj = obj[0];
for (var i=0, path=path.split('.'), len=path.length; i<len; i++){
obj = obj[path[i+1]];
};
return obj;
};
alert(deep_value('obj.foo.bar'));
(我编辑了他的代码只是为了一个实验)。上面的代码不需要 obj 这是一个完美的代码 - 如果它有效 - 并且没有看到任何错误,那么为什么这段代码不起作用,正确的代码是什么?
提前致谢
最佳答案
您的#3 选项存在一些问题:
第一个 obj = obj[0];
只是有 obj === "obj"
这根本不会帮助你。您需要实际获取 window["obj"]
才能获取顶级对象。
其次,您遍历 for
循环的次数过多,超出了 path
数组的末尾。
如果 obj
位于顶级范围,则在这两个区域中进行更改将使其正常工作:
var obj = {
foo: { bar: 'baz' }
};
var deep_value = function(path, baseObj){
baseObj = baseObj || window;
var obj = path.split('.');
obj = baseObj[obj[0]];
for (var i=1, path=path.split('.'), len=path.length; i<len; i++){
obj = obj[path[i]];
};
return obj;
};
alert(deep_value('obj.foo.bar'));
工作演示:http://jsfiddle.net/jfriend00/jGb5p/
<小时/>这是一些经过清理的版本:
var obj = {
foo: { bar: 'baz' }
};
var deep_value = function(path, baseObj){
baseObj = baseObj || window;
var pieces = path.split('.');
// get root level object
var obj = baseObj[pieces[0]];
for (var i = 1, len = pieces.length; i < len; i++){
obj = obj[pieces[i]];
}
return obj;
};
console.log(deep_value('obj.foo.bar'));
关于javascript - 使用字符串检索对象的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24857544/