首页 > 解决方案 > 需要将文件路径数组转换为treeview json对象

问题描述

需要将文件路径数组转换为 Treeview JSON 对象

数组数据:

[path1/subpath1/file1.doc",
"path1/subpath1/file2.doc", 
"path1/subpath2/file1.doc", 
"path1/subpath2/file2.doc", 
"path2/subpath1/file1.doc", 
"path2/subpath1/file2.doc", 
"path2/subpath2/file1.doc", 
"path2/subpath2/file2.doc", 
"path2/subpath2/additionalpath1/file1.doc"]

我想要下面的对象结果:

{
   "title": "path1",
   "childNodes" : [
     { "title":"subpath1", "childNodes":[{ "title":"file1.doc", "childNodes":[] }] },
     { "title":"subpath2", "childNodes":[{ "title":"file1.doc", "childNodes":[] }] }
   ] 
}

我能够使用下面的代码片段将其转换为对象,但无法按照我想要的方式进行转换

let treePath = {};
let formattedData = {};
data.forEach(path => {
  let levels = path.split("/");
  let file = levels.pop();
  let prevLevel = treePath;
  let prevProp = levels.shift();
  levels.forEach(prop => {
    prevLevel[prevProp] = prevLevel[prevProp] || {};
    prevLevel = prevLevel[prevProp];
    prevProp = prop;
  });
  prevLevel[prevProp] = (prevLevel[prevProp] || []).concat([file]);
});

我怎样才能做到这一点????

标签: javascriptes6-modules

解决方案


您可以减少路径的部分并搜索相同的标题。

const
    pathes = ["path1/subpath1/file1.doc", "path1/subpath1/file2.doc", "path1/subpath2/file1.doc", "path1/subpath2/file2.doc", "path2/subpath1/file1.doc", "path2/subpath1/file2.doc", "path2/subpath2/file1.doc", "path2/subpath2/file2.doc", "path2/subpath2/additionalpath1/file1.doc"],
    result = pathes.reduce((r, path) => {
        path.split('/').reduce((childNodes, title) => {
            let child = childNodes.find(n => n.title === title);
            if (!child) childNodes.push(child = { title, childNodes: [] });
            return child.childNodes;
        }, r);
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读