繁体   English   中英

在javascript中使用基于字符串的键进行json嵌套查找

[英]json nested lookup using string based key in javascript

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

您可以使用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

您可以使用:

data['blog']['title']

我已经尝试了几种方法来做到这一点,包括评估和使用带有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 我用它来遍历几千个项目,并且深度嵌套数据没有问题。 另外,由于(小的)性能问题: jsPerf ,我不再包装try / catch了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM