2014-09-24 16 views
0

搜索我有一個JSON具有文件夾和文件的層次結構,它 我想獲得一個文件夾ID 這裏一個文件夾及其子文件夾中的文件數量的JSON通過的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"它應該給我的只有2個文件,其是"C22-1(EU仕様)_20140923162409.xlsx""Machine_Inspection_20140923162329.xlsx"但如果我把folder name "Root"和我d= "Root"它應該返回我的所有文件

這裏的ID是哪個我就http://jsfiddle.net/ma3kno2o/

+0

很明顯,循環所有這些會讓你得到你想要的。但這不是非常有效。我認爲你需要一個不同的結構,所以你可以直接訪問'root',並且可以訪問同一級別的子文件夾,但是需要參考他們的'父'。 – kasimir 2014-09-24 07:16:09

+0

只是一個簡短的提示 - 'jsonStr'不是JSON,它是一個JavaScript對象。 – phuzi 2014-09-24 07:46:45

回答

1

不是最好的(對不起,凌晨4點)的解決方案,而是通過遞歸直線方式.. 您的結構不支持,在正常這樣,同一級別的文件夾,所以我重新配置它,togerther與它的代碼: http://jsfiddle.net/ma3kno2o/5/

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

的舊代碼將無法正常工作,所以我改寫了它新的雜物

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"}}]}}}; 
+0

來搜索您的混凝土結構非常感謝您的工作完美:-) – 2014-09-24 08:12:05

+0

@AdilWaqar您的結構並不假定一個同一級別的文件夾夾?因爲'文件夾'屬性沒有文件夾數組。 – Cheery 2014-09-24 09:05:48

+0

請看看這個小提琴,我已經重建了層次結構,它現在不工作http://jsfiddle.net/ma3kno2o/4/ – 2014-09-24 09:18:21

3

工作,就可以使用Defiant.js

這裏搗鼓爲您的具體搜索場景拉文件ID的小提琴具有ID:root和Name:root:的元素。我在這個例子中使用Defiant.js:

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

Defiant.js優於由@Cheery答案的自定義搜索,以獲取文件的ID我不得不用一行代碼:

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數據= { grouped_people:{ '朋友':[ {名稱: '史蒂夫',國家: 'NZ'}, {名稱: '鮑勃',國家: '美國'} ] , '敵人':[{ 名稱: '邪惡史蒂夫',國家: 'AU'} ] }}

    jsonQuery('grouped_people[][country=NZ]', {data: data}) 
    

    https://github.com/mmckegg/json-query

如果你不喜歡任何一個在這裏你可以找到更多的選擇: Is there a query language for JSON?

+0

你的答案包含優秀的信息,但我的問題是,我有一個多級文件夾和子文件夾層次結構,我不知道我需要檢查hierarchy.folder.file或hierarchy.folder.folder.file等等這個JSON是動態創建,我不知道它的水平 – 2014-09-24 07:30:36

+0

如果是這種情況,我會用不。 4. Defiant.js – 2014-09-24 07:44:24

+0

我已經添加了一個示例如何使用Defiant.js – 2014-09-24 08:10:53