首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用路径从dropbox api增量创建目录树

使用路径从dropbox api增量创建目录树
EN

Stack Overflow用户
提问于 2017-10-26 22:15:09
回答 1查看 206关注 0票数 0

我发现了一个问题,如何将文件路径转换为treeview?,但我不确定如何在JavaScript中获得所需的结果:

我正在尝试将路径数组转换为JSON树:

代码语言:javascript
复制
 var paths = [
        "/org/openbmc/UserManager/Group",
        "/org/stackExchange/StackOverflow",
        "/org/stackExchange/StackOverflow/Meta",
        "/org/stackExchange/Programmers",
        "/org/stackExchange/Philosophy",
        "/org/stackExchange/Religion/Christianity",
        "/org/openbmc/records/events",
        "/org/stackExchange/Religion/Hinduism",
        "/org/openbmc/HostServices",
        "/org/openbmc/UserManager/Users",
        "/org/openbmc/records/transactions",
        "/org/stackExchange/Religion/Islam",
        "/org/openbmc/UserManager/Groups",
        "/org/openbmc/NetworkManager/Interface"
    ];

我想要像下面这样的json结构,使用文件夹路径。

代码语言:javascript
复制
        var xyz = [{
            "path": "photos",
            "name": "photos",
            "children": [
              {
                "path": "photos/summer",
                "name": "summer",
                "children": [
                  {
                    "path": "photos/summer/june",
                    "name": "june",
                    "children": [
                      {
                        "path": "photos/summer/june/windsurf",
                        "name": "windsurf",
                      }
                    ]
                  }
                ]
              },
              {
                "path": "photos/winter",
                "name": "winter",
                "children": [
                  {
                    "path": "photos/winter/january",
                    "name": "january",
                    "children": [
                      {
                        "path": "photos/winter/january/ski",
                        "name": "ski",
                      },
                      {
                        "path": "photos/winter/january/snowboard",
                        "name": "snowboard",
                      }
                    ]
                  }
                ]
              }
            ]
    }];

我使用了下面的函数,但它不起作用

代码语言:javascript
复制
var parsePathArray = function(paths) {
var parsed = [];
for (var i = 0; i < paths.length; i++) {
    var position = parsed;
    var split = paths[i].split('/');
    for (var j = 0; j < split.length; j++) {
        if (split[j] !== "") {
            if (typeof position[split[j]] === 'undefined')
                position[split[j]] = {};
            position.children = [position[split[j]]];
            position.name = split[j];
            position = position[split[j]];

        }
    }
}
return parsed;
}
EN

回答 1

Stack Overflow用户

发布于 2017-10-27 00:34:50

免责声明:我写这个答案是因为它是一个有趣的练习。我仍然对你感到失望,因为你没有尝试,也没有花时间解释什么是,你不理解...

我没有遵循您的确切格式,所以您必须尝试理解它是如何完成的,而不是复制代码然后离开:)

我将简要介绍每个步骤,以免冒险解释您已经知道的内容。

步骤1:

从字符串列表转到数组列表:

代码语言:javascript
复制
["a/1", "a/2", "b/1"] -> [["a", "1"], ["a", "2"], ["b", "1"]]

我们使用String.prototype.slice删除带有文件夹分隔符的前缀"/“和String.prototype.split,以将其转换为数组:path.split("/")

第二步

循环遍历每个文件夹,并将该文件夹添加到对象中。

代码语言:javascript
复制
[["a", "1"], ["a", "2"], ["b", "1"]] -> { a: { 1: {}, 2: {} }, b: { 1: {} } }

我们使用一个reducer,它使用括号表示法obj[key]访问对象,实例化新的文件夹对象,并在此过程中返回最深的位置。

第三步

递归循环对象的键并将其转换为指定的格式:

代码语言:javascript
复制
{ a: { 1: { } } -> { name: "a", path: [], children: [ /* ... */ ] }

我们使用Object.keys获取一个关键字列表,这些关键字是文件夹名称。递归调用每个嵌套的对象。

请更新您的答案与您有问题的具体步骤,允许其他人的帮助,以及我来描述更详细的步骤。

代码语言:javascript
复制
const pathStrings = ["/org/openbmc/UserManager/Group", "/org/stackExchange/StackOverflow", "/org/stackExchange/StackOverflow/Meta", "/org/stackExchange/Programmers", "/org/stackExchange/Philosophy", "/org/stackExchange/Religion/Christianity", "/org/openbmc/records/events", "/org/stackExchange/Religion/Hinduism", "/org/openbmc/HostServices", "/org/openbmc/UserManager/Users", "/org/openbmc/records/transactions", "/org/stackExchange/Religion/Islam", "/org/openbmc/UserManager/Groups", "/org/openbmc/NetworkManager/Interface"];

const paths = pathStrings
    .map(str => str.slice(1))       // remove first "/"
    .map(str => str.split("/"));

// Mutates map!
const mergePathInToMap = (map, path) => {
    path.reduce(
        (loc, folder) => (loc[folder] = loc[folder] || {}, loc[folder]),
        map      
    );

    return map;
};

// Folder structure as { folderName: folderContents }
const folderMap = paths.reduce(mergePathInToMap, {});

// Go from 
//   { folderName: folderContents }
// to a desired format like 
//   { name: folderName, children: [contents] }
const formatStructure = (folder, path) => {
    return Object
        .keys(folder)
        .map(k => ({ 
            name: k,
            path: path,
            children: formatStructure(folder[k], path.concat(k))
        }))
    
}

console.log(
    JSON.stringify(
        formatStructure(folderMap, []),
        null,
        2
    )
)
代码语言:javascript
复制
.as-console-wrapper { min-height: 100% }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46956710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档