1

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

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

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

正如我所看到的,我至少有几个选择。

  1. 我可以搜索。如果name是唯一的,我可以缩放树以查找元素,直到找到它。我以前从未使用过 Javascript,但我希望它会很慢。

  2. 我可以使用这样的导航路径options:1:options:1来描述路径的每个键。同样,我从来没有这样做过,但是假设没有错误,它会快很多。你将如何实施它?

我还有其他选择吗?什么看起来最好?有没有办法在 JSON 解码时解包,或者这是一个无限循环的秘诀?

4

1 回答 1

3

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. 另请注意,我们可以用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"}
于 2013-08-22T13:16:13.167 回答