2016-04-11 25 views
0

gibi bir şeye dönüştürmek Önce, bir nesne dizim veya derinlemesine olmayan yalnızca bir nesnem yok. Aşağıdaki yapıya sahibim, temel olarak bir klasör ve dosya ağacı.İç içe geçmiş nesnelerin/dizilerin nesnesini 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": [] 
      } 
     } 
    } 
} 

ben/klasörleri bu dosyaları göstermek için Açısal bir şablon oluşturmak, böylece bir diziye bu olsun istiyorum. Açıkçası oldukça sunucu nesne gibi bana çalışılabilir bir dizi döndürür olurdu, ancak bir hayır şu anda şu gitmek

[{ 
    "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": [] 
     }] 
    }] 

}] 

: gibi

şey.

+0

Yalnızca ilk düğümde bana ulaşan bir Object.keys harita işlevini kullanmayı denedim. Bu konudan: http://stackoverflow.com/questions/20881213/converting-json-object-into-javascript-array – Jason

cevap

2

Dizinlerinizin üzerinde yinelemek için yinelemeli bir işlev denemelisiniz. Her dizin için bir düğüm oluşturup, çocuk dizinleri için aynı işlevi çağırırsınız. Burada

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>
Ve demo fiddle olduğunu.

+0

Teşekkür ederiz! Çok uzak çok iyi. :) – Jason

İlgili konular