将嵌套对象/数组的对象转换为类似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中构建一个模板来显示这些文件/文件夹。
类似于:
[{
"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": []
}]
}]
}]
很明显,我宁愿让服务器给我返回一个可行的类似数组的对象,但现在还不行。
您应该尝试一个递归函数来迭代目录。您为每个目录创建一个节点,并为其子目录调用相同的函数。
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>
这是一把示范小提琴。
相关文章:
- 将数组对象传递到struts2中的操作类
- 如何使用jquery返回php-json数组对象
- 从其名称获取javascript数组对象
- 值未与数组对象绑定
- 如何按数组/对象值的倍数过滤对象数组
- 在表中显示数组对象
- 在数组对象中分组
- 将第二个或多个数组推送到数组对象 AngularJS 中
- 重新排列 JavaScript 数组/对象
- 键上的javascript数组对象过滤器
- handontable:在不更改数据数组/对象的情况下隐藏某些列
- 用于跟踪购物车可用性的Javascript数组/对象/哈希表
- 重建有角度的java脚本数组对象
- 对JSON数组对象进行排序
- 连接与数组对象相关的文本:方式和位置
- 哪些浏览器和版本支持将常见的类数组对象直接传递到fn.apply()
- 如何使用Handlebars循环数组对象和模板
- 是否可以引用JS数组/对象中的另一个元素
- Javascript中的名称索引-数组/对象
- 数组长度不等于数组对象