json嵌套查找在JavaScript中使用基于string的键

用这样的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 

但是我需要能够做下面的代码,因为我不能对结构进行硬编码,每次都会生成并存储在查找中。 我必须使用string切割和recursion来构build这个function吗? 我真的希望不是

 console.log(data['blog.title']); //does not work console.log(data[lookup]); //does not work 

编辑….

好的,可能find了一个解决方法。 我不知道这是否安全或推荐的做法,所以对此的评论会很好。 或者可选的方法。 所以结合上面的代码。

 var evaltest = "var asdf ="+JSON.stringify(data)+";\n" evaltest += "asdf."+lookup console.log(eval(evaltest)) //returns correctly "my blog" as expected 

你可以使用dottie https://www.npmjs.org/package/dottie ,它允许你深入遍历一个对象使用string

 var values = { some: { nested: { key: 'foobar'; } } } dottie.get(values, 'some.nested.key'); // returns 'foobar' dottie.get(values, 'some.undefined.key'); // returns undefined 

你可以使用:

 data['blog']['title'] 

我已经尝试了一些方法,包括eval和使用开关(exp.length)的字典查找。 这是我创build的最终版本(剥离的评论):

 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的评论如下: gist.github.com/jeff-mccoy/9700352 。 我用这个循环了几千个项目,并且没有深嵌套数据的问题。 另外,由于(小)性能命中,我不再包含在try / catch中: jsPerf 。