所以我得到了一个 JSON 文件,它被解析为 Javascript 中的一个对象。我知道你在想什么:幸运的家伙。 JSON 本质上是一个大树形式的流程图。这是我要实现的目标的一个小例子:
tree = {
"options": [
{
"options": [
{
"name": "target",
},
],
},
{
"options": [
{
"link": "...?",
},
],
},
]
}
所以在这个例子中,我将深入第二个分支(它说 "link"
),我希望能够跳转到包含 的分支“名称”:“目标”
。记住这是 JSON,所以它需要是一个字符串(除非有一个本地链接?!是吗?)但我不知道如何最好地格式化它。
在我看来,我至少有几个选择。
我可以搜索。如果
name
是唯一的,我可以缩放树以查找元素,直到找到为止。我以前从未用过 Javascript,但我预计它会很慢。我可以使用像
options:1:options:1
这样的导航路径来描述路径的每个键。同样,我从来没有这样做过,但假设没有错误,它会快得多。您将如何实现?
我还有其他选择吗?什么看起来最好?有没有办法在 JSON 解码时解压它,或者这是无限循环的秘诀?
最佳答案
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);
回退到窗口
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 block 可防止损坏的链接抛出错误。
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"}
关于javascript - 引用 JSON 树结构分支的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18381259/