javascript - 在 JavaScript 中解析 JSON 对象以生成数组
问题描述
我有以下 JSON,里面有files
and folders
(保留字)来指示哪些是文件和文件夹。
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)
有人可以帮我一把吗?
解决方案
您可以使用循环创建递归函数,for...in
该函数将数据作为第一个参数和键数组添加到您可以传递的结果中时忽略files
,folder
等等......
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)
推荐阅读
- python - 如何使用循环创建一个函数来返回python上大写和小写字母的数量?
- python - 如何将数据框作为新列添加到其他数据框?
- javascript - 从模态对原始组件反应本机调用函数
- mysql - 通过调用.sql文件的windows批处理文件恢复mysql备份
- javascript - 多次运行 IndexOf JS
- flutter - Riverpod:是否有在另一个 StreamProvider 中读取 StreamProvider 的正确方法?
- spring - Spring Batch 测试 - Autowired bean 为空
- r - 在 Ubuntu 上从 CRAN 安装 lme4
- nlp - Stanford-NLP Parser 错误地拆分了我的句子
- javascript - 动画未制作jquery(背景颜色)