2014-07-25 79 views
-1

我想以遞歸方式提取此結構中的文件。我已經完成了第一級,但不能繼續。在javascript中遞歸地從數組中提取值

var DirectoryTree = { 
    dir: 'project1', 
    files: [ 
     'proj.config', { 
      dir: 'src', 
      files: [ 
       'name.htm', 
       'dept.htm', 
       'salary.htm', { 
        dir: 'scripts', 
        files: [ 
         'name.js', 
         'dept.js', 
         'salary.js' 
        ] 
       } 
      ] 
     }, { 
      dir: 'project2', 
      files: [ 
       'proj.config', { 
        dir: 'src', 
        files: [ 
         'name.htm', 
         'dept.htm', 
         'salary.htm', { 
          dir: 'scripts', 
          files: [ 
           'name.js', 
           'dept.js', 
           'salary.js' 
          ] 
         } 
        ] 
       } 
      ] 
     } 
    ] 
}; 

下面是我到目前爲止的代碼。我有點卡在這裏。你能幫我從下一個層面獲取數據嗎?

function listFiles(dirTree, subFolder){ 
    var fList=[]; 
    if(dirTree.files){ 
     for (var i=0;i<dirTree.files.length;i++){ 
      if(typeof dirTree.files[i] === 'string'){ 
       fList.push(dirTree.files[i]); 
      } 
     } 
    } 
    if(dirTree.dir){ 
     return(listFiles(dirTree.dir, subFolder)); 
    } 
    return fList; 
} 
+0

1.)你是否想要獲取所有文件? 2.)你爲什麼要這樣做? –

+0

此外,您正嘗試從***對象中提取值 - 而不是「數組」。準確。 :) –

+0

是的。所有的文件名。 – buggedUp

回答

1

您可以遞歸做到這一點,像這樣

function getFiles(currentObject, result) { 
    var type = Object.prototype.toString.call(currentObject), 
     idx; 
    if (type === "[object Object]") { 
     for (idx in currentObject) { 
      if (currentObject.hasOwnProperty(idx) && idx === "files") { 
       currentObject[idx].forEach(function(object) { 
        getFiles(object, result); 
       }); 
      } 
     } 
    } else if (type === "[object Array]") { 
     currentObject.forEach(function(object) { 
      getFiles(object, result); 
     }); 
    } else if (type === "[object String]") { 
     result.push(currentObject); 
    } 
    return result; 
} 

console.log(getFiles(DirectoryTree, [])) 

輸出

[ 'proj.config', 
    'name.htm', 
    'dept.htm', 
    'salary.htm', 
    'name.js', 
    'dept.js', 
    'salary.js', 
    'proj.config', 
    'name.htm', 
    'dept.htm', 
    'salary.htm', 
    'name.js', 
    'dept.js', 
    'salary.js' ] 
0

我回答了類似的問題今天和使用一些強調功能解決了這個問題。
您的示例的格式很奇怪,但我會再次建議使用遞歸函數對於這種類型的讀取:

function recursiveFuntion(collection){ 
    collection.forEach(function(model) { 
     //console.log(model.files); --> Or do whatever you need 
     if(model.files.length > 0){ 
      recursiveFunction(model); 
     }; 
    }); 
}; 

recursiveFuntion(DirectoryTree.files); 

遞歸函數的好處是,它是動態的。
由於您不是使用數組,而是使用對象,因此您需要自定義此代碼。
但這是基本原則。