所以我有一个JSON文件被解析为Javascript中的对象。我知道你在想什么:幸运的家伙。 JSON本质上是一种大树形式的流程图。这是我想要实现的一个小样本:
tree = {
"options": [
{
"options": [
{
"name": "target",
},
],
},
{
"options": [
{
"link": "...?",
},
],
},
]
}
所以在这个例子中,我将深入到第二个分支(它表示"link"
)并且我希望能够跳转到包含"name": "target"
的分支。这是JSON记得所以它需要是一个字符串(除非有本地链接?!有吗?)但我不知道如何最好地格式化。
在我看来,我至少有几个选择。
我可以搜索。如果name
是唯一的,我可以扩展树,寻找元素直到找到它。我之前从未使用过Javascript,但我认为它很慢。
我可以使用options:1:options:1
之类的导航路径来描述路径的每个键。再说一次,我从来没有这样做过,但假设没有错误,那就快了很多。你会如何实现它?
我还有其他选择吗?最好的是什么?有没有办法在JSON解码时解压缩,或者是无限循环的配方?
答案 0 :(得分: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"}