【问题标题】:Parse a JSON object in JavaScript to generate an array在 JavaScript 中解析 JSON 对象以生成数组
【发布时间】:2020-06-09 10:12:32
【问题描述】:

我有以下 JSON,里面有 filesfolders(保留字)来指示哪些是文件和文件夹。

the_name_of_the_folder_itself:
    "files": [array_of_files_]
    "folders": [objects of folders inside this dir]

更容易看到 JSON 本身:

{
    "configfiles": {
        "folders": {
            "dir1": {
                "files": [
                    "data.dat",
                    "data2.dat"
                ]
            },
            "dir2": {
                "folders": {
                    "subffolder": {
                        "files": [
                            []
                        ]
                    },
                    "subffolder_2": {
                        "files": [
                            "other.dat"
                        ]
                    }
                },
                "files": [
                    []
                ]
            }
        },
        "files": [
            []
        ],
        "LoadBase": "barfoo IGNORE THIS"
    }
}

如何从该 JSON 中获取所有路径和文件,这意味着有一个包含以下元素的输出数组?

configfiles/
configfiles/dir1/
configfiles/dir1/data.dat
configfiles/dir1/data2.dat
configfiles/dir2/
configfiles/dir2/subffolder/
configfiles/dir2/subffolder_2/
configfiles/dir2/subffolder_2/other.dat

这是我目前的尝试:

function getPathAndFolder(folderPath)
{
    foldersArray = Object.keys(folderPath)
    foldersArray.forEach(function callback(folderName, index, array)
    {
        finalArray.push(folderName)
        filesArray = folderPath[folderName].files
        filesArray.forEach(function callback(fileName, index, array)
        {
            finalPath = folderName + "/" + fileName
        });

        // Call it again
        //getPathAndFolder()

    });
}

finalArray = []
getPathAndFolder(inputJSONobject)

有人可以帮帮我吗?

【问题讨论】:

  • 不应该是{folders: { configfiles: { /* ... */ } }吗?
  • 不,第一个/主要的之前没有folders

标签: javascript arrays json object


【解决方案1】:

您可以使用for...in 循环创建递归函数,该循环将数据作为第一个参数和键数组添加到您可以传递filesfolder 等的结果中时忽略...

const json = {"configfiles":{"folders":{"dir1":{"files":["data.dat","data2.dat"]},"dir2":{"folders":{"subffolder":{"files":[[]]},"subffolder_2":{"files":["other.dat"]}},"files":[[]]}},"files":[[]],"LoadBase":"barfoo IGNORE THIS"}}

function getPaths(data, ignored = [], prev = '') {
  const result = []

  for (let i in data) {
    let path = prev;

    if (!ignored.includes(i)) {
      if (!Array.isArray(data)) {
        path += (prev.length ? '/' : '') + i
        result.push(path)
      } else if (data[i].length) {
        result.push(path + '/' + data[i])
      }
    }

    if (typeof data[i] === 'object') {
      result.push(...getPaths(data[i], ignored, path))
    }
  }

  return result;
}

const ignored = ['files', 'folders', 'LoadBase']
const result = getPaths(json, ignored);
console.log(result)

【讨论】:

  • 只是出于好奇,当您再次调用getPaths 时,... 是如何工作的?
  • getPaths 的每次调用都将始终返回一个数组(结果变量),因此当您创建 getPaths 的递归调用时,您希望在将其推送到结果时传播该数组(getPaths 返回的内容),以便您推送每个单独的对象而不是数组。为了更好地理解你可以看到这个jsfiddle.net/w1cmrqf8
猜你喜欢
  • 2014-12-02
  • 1970-01-01
  • 2016-07-08
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
相关资源
最近更新 更多