使用像这样的javascript json对象:
var data = {
blog : {
title: "my blog",
logo: "blah.jpg",
},
posts : [
{
title: "test post",
content: "<p>testing posts</p><br><p>some html</p>"
},
]
}
var lookup = "blog.title" //this gets generated from a template file
现在我知道你可以做类似的事情,但这些并不能满足我的需要:
console.log(data['blog']); //works
console.log(data.blog.title); //works
console.log(data['blog']['title']); //works, but i dont know the depth of the lookup
但我需要能够执行类似下面的代码,因为我无法对结构进行硬编码,每次都会生成并存储在查找中。我是否必须使用字符串剪切和递归来构建此功能?我真的希望不是
console.log(data['blog.title']); //does not work
console.log(data[lookup]); //does not work
编辑...
好的,可能找到了解决方法。我不知道这是否是安全或推荐的做法,所以对此的评论会很棒。或者替代方法。所以将它与上面的代码结合起来。
var evaltest = "var asdf ="+JSON.stringify(data)+";\n"
evaltest += "asdf."+lookup
console.log(eval(evaltest)) //returns correctly "my blog" as expected
答案 0 :(得分:1)
您可以使用dottie https://www.npmjs.org/package/dottie,它允许您使用字符串深度遍历对象
var values = {
some: {
nested: {
key: 'foobar';
}
}
}
dottie.get(values, 'some.nested.key'); // returns 'foobar'
dottie.get(values, 'some.undefined.key'); // returns undefined
答案 1 :(得分:0)
你可以使用:
data['blog']['title']
答案 2 :(得分:0)
我已经尝试了几种方法,包括eval和使用switch(exp.length)进行字典查找。这是我创建的最终版本(评论摘录):
var deepRead = function (data, expression) {
var exp = expression.split('.'), retVal;
do {
retVal = (retVal || data)[exp.shift()] || false;
} while (retVal !== false && exp.length);
return retVal || false;
};
//example usage
data = {
a1: { b1: "hello" },
a2: { b2: { c2: "world" } }
}
deepRead(data, "a1.b1") => "hello"
deepRead(data, "a2.b2.c2") => "world"
deepRead(data, "a1.b2") => false
deepRead(data, "a1.b2.c2.any.random.number.of.non-existant.properties") => false
这里是完整评论的要点:gist.github.com/jeff-mccoy/9700352。我使用它来循环数千个项目,并且没有深层嵌套数据的问题。此外,由于(小)性能影响,我不再包装在try / catch中:jsPerf。