Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将树状文件目录转换为JSON对象_Javascript_Json_Treeview - Fatal编程技术网

Javascript 将树状文件目录转换为JSON对象

Javascript 将树状文件目录转换为JSON对象,javascript,json,treeview,Javascript,Json,Treeview,我正在尝试将文件目录响应转换为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/S

我正在尝试将文件目录响应转换为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对象的开始。所有以前的“文件夹目录”都将被剪裁

我曾尝试编写一个函数来实现这一点,但由于“Users”文件夹出现了两次,我遇到了一些问题。此外,该函数没有正确地遍历节点,它只是在设置的部分剪切节点并将它们粘合在一起。太可怕了,我有点惭愧

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(目录,cutAfter){
对于(var i=directory.length-1;i>=0;i--){
目录[i]=目录[i].substr(目录[i].indexOf(cutAfter)+cutAfter.length,目录[i].length-1);
目录[i]=目录[i]。拆分(“/”;
目录[i].shift();
};
jsonA={};jsonB={};jsonC={};
对于(var i=0;i

如果有人能向我展示一种更好的方法,将“树视图模型”转换为“JSON对象”,我将不胜感激。我很好奇其他开发人员会采取什么样的方法,以及最简单的解决方案是什么。

一个非常常见的操作是提取最后一个斜杠后的字符串部分,因此我会为此创建一个正则表达式函数。从数组中的第一个元素中标识起始目录名,然后使用简单的
for
循环,逐个遍历数组的其余部分,提取键和值:

const输入=[
'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/123213',
'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]=输入;
const dirName=lastPart(baseDirectory);
常量dirObj={};
对于(设i=0;i控制台日志(输出)
您可以按“用户”和
拆分。reduce()
生成的数组:

const data=['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/123213',
'C:/Users/Freddy/System/storage/Objects/Users/1/username',
'C:/Users/Freddy/System/storage/Objects/Users/1/username/Freddy1337'
];
常量对象=数据
.map(e=>{
返回e.split(“用户”)[2];
})
.减少((全部,当前)=>{
设elems=curr.split('/');
all[elems[1]]=all[elems[1]]| |{};
if([elems[2]]和&elems[3]){
分配(所有[elems[1]]{
[elems[2]]:elems[3]
})
}
//元素[1]是:1
//elems[2]是密钥(用户名、密码..)
//elems[3]是值(Freddy1337…)
全部归还;
}, {})

console.log(objects)
是输入中紧跟在“key”(例如
password
)之后的“value”(例如
123213
)吗?是的,但是如果看到一个函数没有那些“key”是最深入的属性的限制,那就太酷了;[baseDirectory,…keysVals]=输入;以前在JS中没有见过这样的东西。感谢好友的建议/提示。这叫做扩展语法: