繁体   English   中英

引用JSON树结构的分支的最佳方法是什么?

[英]What are the best ways to reference branches of a JSON tree structure?

所以我有一个JSON文件被解析为Javascript中的对象。 我知道你在想什么:幸运的家伙。 JSON本质上是一种大树形式的流程图。 这是我想要实现的一小部分样本:

tree = {
    "options": [
        {
            "options": [
                {
                    "name": "target",
                },
            ],
        },
        {
            "options": [
                {
                    "link": "...?",
                },
            ],
        },
    ]
}

所以在这个例子中,我将深入第二个分支(它表示"link" )并且我希望能够跳转到包含"name": "target"的分支"name": "target" 这是JSON记得所以它需要是一个字符串(除非有本地链接?!是吗?)但我不知道如何最好地格式化它。

在我看来,我至少有几个选择。

  1. 我可以搜索。 如果name是唯一的,我可以扩展树,寻找元素直到找到它。 我之前从未使用过Javascript,但我认为它很慢。

  2. 我可以使用类似options:1:options:1的导航路径options:1:options:1描述路径的每个键。 再说一次,我从来没有这样做过,但假设没有错误,那就快了很多。 你会如何实现它?

我还有其他选择吗? 最好的是什么? 有没有办法在JSON解码时解压缩,或者是无限循环的配方?

link: 'tree.options[0].options[0]'怎么样link: 'tree.options[0].options[0]'然后是eval(path.to.link)

以下样品仅使用Chrome进行测试。 同一棵树为所有人:

var tree = { level1: [{ key: 'value' }] };

没有eval

function resolve(root, link) {
    return (new Function('root', 'return root.' + link + ';'))(root);
}

var value = resolve(tree, path.to.link);

回落到window

function resolve(root, link) {
    return (new Function(
        'root', 'return root.' + (link || root) + ';'
    ))(link ? root : window);
}

resolve(tree, 'level1[0].key'); // "value"
resolve('tree.level1[0].key'); // "value"

捕捉错误

try / catch块可防止断开的链接抛出错误。

function resolve(root, path) {
    try {
        return (new Function('root', 'return root.' + path + ';'))(root);
    } catch (e) {}
}

resolve(tree, 'level1[0].key'); // "value"
resolve(tree, 'level1[1].key'); // undefined

使用自定义路径格式

这里的好处是我们可以以root身份传递对象或数组。 另请注意,我们可以使用我们选择的任何char替换path.split('/')的斜杠。

function resolve(root, path) {
    path = '["' + path.split('/').join('"]["') + '"]';
    return (new Function('root', 'return root' + path + ';'))(root);
}

resolve(tree.level1, '0/key'); // "value"
resolve(tree, 'level1/0/key'); // "value"
resolve(tree, 'level1/0'); // Object {key: "value"}

暂无
暂无

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

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