我的JSON看起来像这样:
{
"greeting": {
"hello": ["world", "josue", "everybody"]
}
}
我想知道为什么我不能使用字符串来访问它的属性,如:
var str = 'greeting.hello';
var obj = { "greeting": { "hello": ["world", "josue", "everybody"] } };
console.log(obj.str);
以上代码记录未定义。
但是,如果我使用eval()
(我真的不想......),它会按预期工作。
var str = 'greeting.hello';
var obj = { "greeting": { "hello": ["world", "josue", "everybody"] } };
console.log(eval('obj.'+str));
返回["world", "josue", "everybody"]
。
为什么我不能使用第一个例子?有没有办法使用第一个示例中显示的字符串访问hello键(不使用eval或修改JSON)?
答案 0 :(得分:2)
在Angular中,您使用$parse
服务(ref):
var str = 'greeting.hello';
var obj = { "greeting": { "hello": ["world", "josue", "everybody"] } };
var getter = $parse(str);
var theValue = getter(obj);
答案 1 :(得分:1)
您正在使用console.log(obj.str);
尝试访问对象的“str”属性(不存在)。要访问您要使用的属性console.log(obj["greeting"]["hello"]);
或obj.greeting.hello
。这就是您在评估代码时所做的工作,即评估字符串“obj.greeting.hello”。
你可以写一个这样的函数来做你想要的。
function navigate(str, obj) {
var out = obj;
str.split(".").forEach(function (el) {
out = out[el];
});
return out;
}
答案 2 :(得分:0)
在您的第一个示例中,访问obj.str
将尝试访问str
obj
的{{1}}属性(字面"str"
,而不是str
变量的值)。
如果str
包含密钥名称,则可以使用括号表示法访问对象属性,如下所示:obj[str]
。但是,这种表示法不允许使用像您一样的属性路径。
这是一个拆分属性路径并访问正确属性的函数:
function getProperty(obj, str) {
var path = str.split(".");
if (path.length == 0) {
return undefined;
}
var pointer = obj;
for (var i = 0, l = path.length; i< l; i++) {
pointer = pointer[path[i]];
}
return pointer;
}
现在您可以使用以点分隔的路径访问属性:
var str = 'greeting.hello';
var obj = { "greeting": { "hello": ["world", "josue", "everybody"] } };
console.log(getProperty(obj, str));