简体   繁体   English

将嵌套对象/数组的对象转换为类似于javascript中的数组

[英]Converting an object of nested objects / arrays into something array like in javascript

First off, I don't have an array of objects, or just one object with no depth. 首先,我没有一组对象,或者只有一个没有深度的对象。 I have the following structure, basically a tree of folders and files. 我具有以下结构,基本上是一棵文件夹和文件树。

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

I'd like to get this into an array so I can build a template in Angular to show these files/folders. 我想将其放入数组,以便可以在Angular中构建模板以显示这些文件/文件夹。

Something like : 就像是 :

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

}]

I'd obviously rather have the server return me a workable array like object, but thats a no go right now. 我显然宁愿让服务器返回一个像对象一样的可行数组,但是那现在就不行了。

You should try a recursive function to iterate over your directories. 您应该尝试使用递归函数来遍历目录。 Yo create a node for each directory and you call the same function for it's child 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> 

And here is a demo fiddle . 这是一个演示小提琴

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM