首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaScript中搜索Json

在JavaScript中搜索Json
EN

Stack Overflow用户
提问于 2014-09-24 07:05:09
回答 2查看 858关注 0票数 0

我有一个Json,其中包含文件夹和文件的层次结构,我正试图通过文件夹Id获取文件夹中的文件数及其子文件夹,这里是json

代码语言:javascript
复制
var jsonStr = {
    "hierarchy": {
        "date": "2014/09/24 15:21:23",
        "folder": {
            "name": "Root",
            "id": "Root",
            "file": [{
                "id": "22U2621210__PIN_検査報告書Ver1.0_20140923162232.xls"
            }, {
                "id": "C22-1(EU仕様)_20140923162409.xlsx"
            }, {
                "id": "Machine_Inspection_20140923162329.xlsx"
            }],
            "folder": {
                "name": "Level-1",
                "id": "1411396172645",
                "file": {
                    "id": "22U2621210__PIN_検査報告書Ver1.0_20140923162232.xls"
                },
                "folder": {
                    "name": "123",
                    "id": "1411538469568",
                    "file": [{
                        "id": "C22-1(EU仕様)_20140923162409.xlsx"
                    }, {
                        "id": "Machine_Inspection_20140923162329.xlsx"
                    }]
                }
            }
        }
    }
};

所有文件夹都有名称和id,如果想通过使用id进行搜索来获取该特定文件夹及其子文件夹中的文件数(例如,如果我将文件夹name "123"id "1411538469568"放在文件夹中),它应该只给我两个文件,即"C22-1(EU仕様)_20140923162409.xlsx""Machine_Inspection_20140923162329.xlsx",但如果我将folder name "Root"和Id= "Root"放在一起,则应该返回所有文件的id

这是我正在研究http://jsfiddle.net/ma3kno2o/的Fiddle

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-24 07:56:53

不是最好的解决方案(抱歉,凌晨4点),而是直通递归。在正常情况下,您的结构不支持相同级别的文件夹,所以我重新配置了它,使用它的代码:http://jsfiddle.net/ma3kno2o/5/

代码语言:javascript
复制
function getFiles(id)
{
 var files = searchFolders(jsonStr.hierarchy.folders, false);
 alert('Found ' + files.length + " files\n" + JSON.stringify(files));

 function searchFolders(tree, count_files)
 {
    var data = [];     
    $.each(tree, function(key, val) {        
        var into = !count_files ? val.id == id : count_files;

        if (val.files && into)
            $.merge(data, getFiles(val.files));

        if (val.folders)
            $.merge(data, searchFolders(val.folders, into));                  

    });
    return data;
 }

 function getFiles(tree)
 { 
    var files = [];
    if (tree.id) return [tree.id]; 
    $.each(tree, function(key,val) {
       if (val.id)
          files.push(val.id);
    });
    return files;
 };
}


var jsonStr = {
    "hierarchy": {
        "date": "2014/09/24 15:21:23",
        "folders": [{
            "name": "Root",
            "id": "Root",
            "files": [{
                "id": "file.1"
            }, {
                "id": "file.2"
            }, {
                "id": "file.3"
            }],
            "folders": [{
                "name": "Level-1",
                "id": "1411396172645",
                "files": {
                    "id": "file.4"
                },
                "folders": [{
                    "name": "123",
                    "id": "1411538469568",
                    "files": [{
                        "id": "file.5"
                    }, {
                        "id": "file.6"
                    }]},
                    {
                    "name": "123",
                    "id": "1411538469569",
                    "files": [{
                        "id": "file.7"
                    }, {
                        "id": "file.8"
                    }]
                }]
            }]
        }]
    }
};

旧代码不起作用,所以我为您的新varia重写了它。

http://jsfiddle.net/ma3kno2o/8/

代码语言:javascript
复制
function getFiles(id)
{
 var stp = -1;
 var files = searchFolders(jsonStr.hierarchy, false);
 alert('Found ' + files.length + " files\n" + JSON.stringify(files));

 function searchFolders(tree, count_files)
 {
     var data = [];  
     var folders = tree.folder.length > 1 ? tree.folder : [tree.folder];
     $.each(folders, function(key, val) {  
        var into = !count_files ? val.id == id : count_files;

         if (val.file && into)
            $.merge(data, getFiles(val.file));

         if (val.folder)
            $.merge(data, searchFolders(val, into));  
    });
    return data;
 }

 function getFiles(tree)
 { 
    var files = [];
    if (tree.id) return [tree.id]; 
    $.each(tree, function(key,val) {
       if (val.id)
          files.push(val.id);
    });
    return files;
 };
}


var jsonStr= {"hierarchy":{"date":"2014/09/24 18:13:00","folder":{"name":"Root","id":"Root","file":[{"id":"file.1"},{"id":"file.2"},{"id":"file.3"}],"folder":[{"name":"Level-1","id":"1411396172645","file":{"id":"file.4"},"folder":{"name":"123","id":"1411538469568","file":[{"id":"file.5"},{"id":"file.6"}],"folder":{"name":"123-a","id":"1411549962260","file":{"id":"file.7"}}}},{"name":"level-2","id":"1411549976987","file":{"id":"file.8"}}]}}};
票数 1
EN

Stack Overflow用户

发布于 2014-09-24 07:20:07

您可以使用Defiant.js

下面是一个用于具体搜索场景的Fiddle,用于使用ID: root和Name: root:提取元素的文件ID。在本例中我使用的是Defiant.js:

http://jsfiddle.net/3z8mqr3u/1/

Defiant.js优于@Cheery在答案中的自定义搜索,它可以获得我必须使用的一行代码的文件i:

代码语言:javascript
复制
var ids = JSON.search(json,  "//*[name = 'Root' and id = 'Root']/file/id");

它在搜索动态数据时不太容易出错。Defiant.js使用XPath表达式。请查看此链接以了解更多信息:

http://defiantjs.com/

以下是其他一些选择:

  1. 您可以使用普通的JQuery How to search JSON tree with jQuery
  2. 您可以使用JsonPath。这就像用于JSON文件的XPath。你可以做这样的事情: $..folder.file http://goessner.net/articles/JsonPath/ https://code.google.com/p/jsonpath/ https://github.com/s3u/JSONPath
  3. 你可以使用Json查询。它有自己的语言来进行深度查询。例如: var data ={ grouped_people:{“朋友”:{name:'Steve',country:'NZ'},{name:'Bob',country:'US'},‘敌人’:{name:‘邪恶的史蒂夫’,国家:'AU'} jsonQuery(“分组人”,{data: data}) https://github.com/mmckegg/json-query

如果您不喜欢这里的任何一个选项,您可以找到更多的选项:Is there a query language for JSON?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26010599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档