Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 引用JSON树结构分支的最佳方法是什么?_Javascript_Json_Tree - Fatal编程技术网

Javascript 引用JSON树结构分支的最佳方法是什么?

Javascript 引用JSON树结构分支的最佳方法是什么?,javascript,json,tree,Javascript,Json,Tree,所以我有一个JSON文件,它被解析成Javascript中的对象。我知道你在想什么:幸运儿。JSON本质上是一个大树形的流程图。以下是我试图实现的一个小样本: tree = { "options": [ { "options": [ { "name": "target", }, ], },

所以我有一个JSON文件,它被解析成Javascript中的对象。我知道你在想什么:幸运儿。JSON本质上是一个大树形的流程图。以下是我试图实现的一个小样本:

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"}