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

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

本文关键字:数组 对象 javascript 嵌套 转换      更新时间:2024-04-20

首先,我没有对象数组,或者只有一个没有深度的对象。我有以下结构,基本上是一个文件夹和文件树。

    {
    "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>

这是一把示范小提琴。