将嵌套对象/数组的对象转换为类似于 javascript 中的数组
Converting an object of nested objects / arrays into something array like in 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 中构建一个模板来显示这些 files/folders。
类似于:
[{
"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": []
}]
}]
}]
我显然更愿意让服务器 return 给我一个像对象这样的可用数组,但现在不行。
您应该尝试使用递归函数来遍历您的目录。 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.
首先,我没有一组对象,或者只有一个没有深度的对象。我有以下结构,基本上是一棵文件夹和文件树。
{
"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 中构建一个模板来显示这些 files/folders。
类似于:
[{
"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": []
}]
}]
}]
我显然更愿意让服务器 return 给我一个像对象这样的可用数组,但现在不行。
您应该尝试使用递归函数来遍历您的目录。 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.