2016-04-11 11 views
0

まず、オブジェクトの配列や深さのないオブジェクトが1つもありません。私は次の構造、基本的にフォルダとファイルのツリーを持っています。入れ子オブジェクト/配列のオブジェクトをjavascriptのような配列に変換する

{ 
    "C:": { 
     "files": [], 
     "DataStore": { 
      "files": ["Continuous_2016-02-26_15.08.11.dat", 
         "Continuous_2016-02-26_15.38.10.dat", 
         "Continuous_2016-02-26_16.08.09.dat",], 
      "c4": { 
       "160226": { 
        "files": [ 
         "Continuous231.dat", 
         "Continuous_2016-02-26_16.21.58.dat", 
         "Continuous_2016-02-26_16.31.58.dat", 
         "Continuous_2016-02-26_16.41.58.dat", 
         "Continuous_2016-02-26_16.51.58.dat", 
         "Continuous_2016-02-26_17.01.58.dat", 
         "Continuous_2016-02-26_17.11.57.dat", 
         "Continuous_2016-02-26_17.21.57.dat", 
         "Continuous_2016-02-26_17.31.57.dat", 
         "Continuous_2016-02-26_17.41.57.dat" 
        ] 
       }, 
       "files": [] 
      } 
     } 
    } 
} 

私はこれらのファイル/フォルダを表示するためにAngularでテンプレートを作成できるように、これを配列にしたいと思います。私は明らかではなく、サーバーがオブジェクトのように私に実行可能な配列を返すことがないと思いますが、ない今のthats行く

[{ 
    "name": "c:", 
    "files": ["test.dat"], 
    "directories": [{ 
     "name": "DataStore", 
     "files": [], 
     "directories": [{ 
      "name": "c4", 
      "files": [{ 
       "name": "filename.dat" 
      }, { 
       "name": "filename.dat" 
      }, { 
       "name": "filename.dat" 
      }, { 
       "name": "filename.dat" 
      }, { 
       "name": "filename.dat" 
      }], 
      "directories": [] 
     }] 
    }] 

}] 

:よう

何か。

+0

私は最初のノードを介して私を得たObject.keysマップ関数を使ってみました。このスレッドから:http://stackoverflow.com/questions/20881213/converting-json-object-into-javascript-array – Jason

答えて

2

再帰関数を使用してディレクトリを反復処理する必要があります。 Yoは各ディレクトリのノードを作成し、その子ディレクトリに対して同じ関数を呼び出します。

function constructDirecory(directory, name) { 
 
    // create list of files 
 
    var files = []; 
 
    if (directory.files) { 
 
    directory.files.forEach(function(fileName) { 
 
     files.push({ 
 
     name: fileName 
 
     }); 
 
    }); 
 
    } 
 
    // loop list directories 
 
    var directories = []; 
 
    for (var childDirectoryName in directory) { 
 
    if (directory.hasOwnProperty(childDirectoryName)) { 
 
     if (childDirectoryName !== 'files') { 
 
     // it's a directory, see what's inside 
 
     var childDirectoryData = directory[childDirectoryName]; 
 
     var directoryData = constructDirecory(childDirectoryData, childDirectoryName); 
 
     directories.push(directoryData); 
 
     } 
 
    } 
 
    } 
 
    return { 
 
    name: name || 'root', 
 
    files: files, 
 
    directories: directories 
 
    }; 
 
} 
 

 
var data = { 
 
    "C:": { 
 
    "files": [], 
 
    "DataStore": { 
 
     "files": ["Continuous_2016-02-26_15.08.11.dat", 
 
     "Continuous_2016-02-26_15.38.10.dat", 
 
     "Continuous_2016-02-26_16.08.09.dat", 
 
     ], 
 
     "c4": { 
 
     "160226": { 
 
      "files": [ 
 
      "Continuous231.dat", 
 
      "Continuous_2016-02-26_16.21.58.dat", 
 
      "Continuous_2016-02-26_16.31.58.dat", 
 
      "Continuous_2016-02-26_16.41.58.dat", 
 
      "Continuous_2016-02-26_16.51.58.dat", 
 
      "Continuous_2016-02-26_17.01.58.dat", 
 
      "Continuous_2016-02-26_17.11.57.dat", 
 
      "Continuous_2016-02-26_17.21.57.dat", 
 
      "Continuous_2016-02-26_17.31.57.dat", 
 
      "Continuous_2016-02-26_17.41.57.dat" 
 
      ] 
 
     }, 
 
     "files": [] 
 
     } 
 
    } 
 
    } 
 
}; 
 

 
var result = constructDirecory(data); 
 
$('#result').text(JSON.stringify(result, null, 2))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<pre id='result'></pre>

そしてここdemo fiddleです。

+0

ありがとうございました!ここまでは順調ですね。 :) – Jason

関連する問題