所以我有一个JSON文件,该文件被解析为Javascript中的对象。我知道你在想什么:幸运的家伙。JSON本质上是一棵大树形式的流程图。这只是我要实现的目标的一个小示例:
tree = { "options": [ { "options": [ { "name": "target", }, ], }, { "options": [ { "link": "...?", }, ], }, ] }
因此,在此示例中,我将深入研究第二个分支(在其中显示"link"),并且希望能够跳转到包含的分支"name": "target"。记住这是JSON,因此它必须是一个字符串(除非有本地链接?!在那儿?),但我不知道如何最好地格式化它。
"link"
"name": "target"
如我所见,我至少有两个选择。
我可以搜索。如果name是唯一的,我可以缩放树以查找元素,直到找到它。我以前从未使用过Javascript,但我希望它会很慢。
name
我可以使用像options:1:options:1这样的导航路径来描述路径的每个键。再说一次,我从未做过,但是,假设没有错误,它将更快。您将如何实施?
options:1:options:1
我还有其他选择吗?最好的是什么?JSON解码时,有没有办法解开这个包?或者这是无限循环的秘诀?
什么link: 'tree.options[0].options[0]'然后eval(path.to.link)?
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('/')我们选择的任何字符替换斜杠。
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"}