javascript - 将树状文件目录转换为 JSON 对象
问题描述
我正在尝试将文件目录响应转换为 JSON 对象。这是来自文件目录函数的响应的副本。
[ 'C:/Users/Freddy/System/storage/Objects/Users/1',
'C:/Users/Freddy/System/storage/Objects/Users/1/email',
'C:/Users/Freddy/System/storage/Objects/Users/1/email/FreddyMcGee@Gmail.com',
'C:/Users/Freddy/System/storage/Objects/Users/1/etc',
'C:/Users/Freddy/System/storage/Objects/Users/1/etc/etc',
'C:/Users/Freddy/System/storage/Objects/Users/1/password',
'C:/Users/Freddy/System/storage/Objects/Users/1/password/123123123213',
'C:/Users/Freddy/System/storage/Objects/Users/1/username',
'C:/Users/Freddy/System/storage/Objects/Users/1/username/Freddy1337' ]
这是我正在尝试/旨在实现的输出:
1 : {
email: "FreddyMcGee@Gmail.com",
etc: etc,
password: "12313123",
username: "Freddy1337"
}
简单地说,目录中的最短路径就是 JSON 对象的开始。所有以前的“文件夹目录”都被剪掉了。
我试图自己编写一个这样做的函数,但是我遇到了一些麻烦,因为文件夹“用户”出现了两次。此外,该功能不会正确遍历节点,它只是在设定的部分切割它并将它们粘合在一起。太可怕了,我有点惭愧。
function TreeToJson(directory, cutAfter){
for (var i = directory.length - 1; i >= 0; i--) {
directory[i] = directory[i].substr(directory[i].indexOf(cutAfter) + cutAfter.length, directory[i].length - 1);
directory[i] = directory[i].split("/");
directory[i].shift();
};
jsonA = {}; jsonB = {}; jsonC = {};
for (var i = 0; i < directory.length; i++) {
if(directory[i][2] != undefined){
jsonB[directory[i][2]] = directory[i][3]
}
};
jsonC[Number([directory[0][1]])] = jsonB;
jsonA[directory[0][0]] = jsonC;
return jsonA;
}
TreeToJson(files, 'Objects');
如果有人可以向我展示将“树视图模型”转换为“JSON 对象”的更好方法,我将不胜感激。我很好奇其他开发人员会采用的方法,以及最简单的解决方案是什么。
解决方案
一个非常常见的操作是在最后一个斜杠之后提取字符串的一部分,所以我会为此创建一个正则表达式函数。从数组中的第一个元素识别起始目录名称,然后使用一个简单的for
循环遍历数组的其余部分,两乘二,提取键和值:
const input = [
'C:/Users/Freddy/System/storage/Objects/Users/1',
'C:/Users/Freddy/System/storage/Objects/Users/1/email',
'C:/Users/Freddy/System/storage/Objects/Users/1/email/FreddyMcGee@Gmail.com',
'C:/Users/Freddy/System/storage/Objects/Users/1/etc',
'C:/Users/Freddy/System/storage/Objects/Users/1/etc/etc',
'C:/Users/Freddy/System/storage/Objects/Users/1/password',
'C:/Users/Freddy/System/storage/Objects/Users/1/password/123123123213',
'C:/Users/Freddy/System/storage/Objects/Users/1/username',
'C:/Users/Freddy/System/storage/Objects/Users/1/username/Freddy1337'
];
const lastPart = str => str.match(/\/([^\/]+)$/)[1];
const [baseDirectory, ...keysVals] = input;
const dirName = lastPart(baseDirectory);
const dirObj = {};
for (let i = 0; i < keysVals.length; i += 2) {
const key = lastPart(keysVals[i]);
const val = lastPart(keysVals[i + 1]);
dirObj[key] = val;
}
const output = { [dirName]: dirObj };
console.log(output);
推荐阅读
- spring-boot - 在 Spring Boot 执行器上招摇
- javascript - 如何获取当前打开的excel工作簿的本地路径?
- ionic-framework - 为 PWA 使用离子日历
- amazon-web-services - 在“Amazon Linux AMI”上安装 make 4.2
- gpu - Slurm 超额认购 GPU
- c - 标准 C 库中缓冲区大小的特殊宏是什么?
- ios - 子类化 UISlider 以使用 IBDesignable/IBInspectable 自定义拇指图像?
- javascript - 使用 .map() 在 jquery 中分组
- maven - requireProperty 是否不需要 Maven 强制执行器中的典型 Maven 属性?
- firebase - 带有自定义令牌的 Firebase 存储通配符规则