首先,我没有一个对象数组,或者只有一个没有深度的对象。我有以下结构,基本上是一个文件夹和文件树。
{
"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中构建一个模板来显示这些文件/文件夹。
类似的东西:
[{
"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 :(得分: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>
&#13;
这是一个demo fiddle。