Javascript 引用JSON树结构分支的最佳方法是什么?
所以我有一个JSON文件,它被解析成Javascript中的对象。我知道你在想什么:幸运儿。JSON本质上是一个大树形的流程图。以下是我试图实现的一个小样本:Javascript 引用JSON树结构分支的最佳方法是什么?,javascript,json,tree,Javascript,Json,Tree,所以我有一个JSON文件,它被解析成Javascript中的对象。我知道你在想什么:幸运儿。JSON本质上是一个大树形的流程图。以下是我试图实现的一个小样本: tree = { "options": [ { "options": [ { "name": "target", }, ], },
tree = {
"options": [
{
"options": [
{
"name": "target",
},
],
},
{
"options": [
{
"link": "...?",
},
],
},
]
}
因此,在本例中,我将深入第二个分支(其中显示“link”
),我希望能够跳转到包含“name”:“target”
)的分支。这是JSON,请记住,它需要是一个字符串(除非有本地链接?!有吗?),但我不知道如何最好地格式化它
在我看来,我至少有几个选择
name
是唯一的,我可以缩放树以查找元素,直到找到它为止。我以前从未使用过Javascript,但我希望它会很慢options:1:options:1
这样的导航路径来描述路径的每个键。再说一次,我从来没有这样做过,但是,假设没有错误,速度会快得多。您将如何实施它我还有其他选择吗?什么看起来最好?当JSON解码时,有没有办法将其解包,或者这是无限循环的秘诀?关于
链接:'tree.options[0].options[0]'
然后eval(path.to.link)
以下样品仅使用铬进行测试。所有的树都是相同的:
var tree = { level1: [{ key: 'value' }] };
无
eval
回退到
窗口
捕捉错误 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
使用自定义路径格式 这里的好处在于,我们可以将对象或数组作为
根传递。还要注意的是,我们可以用我们选择的任何字符替换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"}
还不清楚“解析dict对象”是什么意思。试着找一个新项目。哈哈,你肯定吃了泡菜。这似乎是你发展自己的功能的一个案例,将树枝一根接一根地撕下来,然后作用于它们。它是JSON,所以我不知道有多少“速度”会成为一个因素。@Pointy我不知道如何更好地表达它。我想“获取”包含名称/值对的对象“name”:“target”
。原谅我,我是一个谈论Javascript的Pythonista,所以我肯定会弄错一些行话。那当然很有趣。。。大量简化了编码方面的工作,安全性在这里并不是一个真正的问题,因为我控制了整个过程。不使用eval的版本肯定会让那些足够关心eval的人感到满意,但是除了使用eval的任意安全风险之外,一种方法比另一种方法有什么优势?我认为在你的情况下没有什么优势。我想说,您对路径的起源有更好的控制,例如,您可以将树的副本传递给resolve
:resolve(treeCopy,path.to.link)
@downvoter我想您对动态代码评估投了反对票。害怕!害怕!好的,只要您保持对输入的控制,这不一定是坏事:。可以在此处找到动态代码求值的替代方法:。
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
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"}