首页 > 解决方案 > 将路径数组转换为对象数组分组

问题描述

我确实找到了这个问题如何将路径数组转换为 JSON 结构?但是,我似乎无法操纵答案来实现我想要的。

我有一组路径,我想将其转换为可以在客户端上轻松使用的对象。

[
    "\\Folder\file.xlsx",
    "\\Folder\file2.xlsx",
    "\\Folder\file3.docx",
    "\\Folder\Folder2\file4.xlsx",
    "\\Folder\Folder2\Folder3\file5.xlsx",
    "\\Folder\Folder2\file6.xlsx",
    "\\Folder\Folder4\file7.pdf"
    "\\Folder\Folder4\Folder5\1. file8.pdf"
]

我试图得到一个看起来像这样的输出:

output = {
    Folder: {
        {
            file: file.xlsx,
            path: \\Folder\file.xlsx

        }, 
        {
            file: file2.xlsx,
            path: \\Folder\file2.xlsx
        }, 
        {
            file: file3.xlsx,
            path: \\Folder\file3.docx
        }
        Folder2: {

                {
                    file: file4.xlsx,
                    path: \\Folder\Folder2\file4.xlsx
                }, 
                Folder3:{

                        {
                            file: file5.xlsx,
                            path: \\Folder\Folder2\Folder3\file5.xlsx
                        },

                },
                {
                    file: file6.docx,
                    path: \\Folder\Folder2\file6.xlsx
                } 
        },
        Folder4: {
            {
                file: file7.pdf,
                path: \\Folder\Folder4\file7.pdf
            },
            Folder5: {
                {
                    file: 1. file8.pdf,
                    path: \\Folder\Folder4\Folder5\1. file8.pdf
                },
            }
        }
    }
}

目前,我有这个给我空对象但没有路径:

        var output = {};
        var current;

        for (var a = 0; a < files.length; a++) {
            var s = files[a].split("\\");
            // console.log("s ===> ", s);
            current = output;

            for (var i = 0; i < s.length; i++) {
                if (s[i] != "") {
                    if (current[s[i]] == null) {
                        current[s[i]] = {};
                    } else {
                        current = current[s[i]];
                    }
                }
            }
        }

但它并没有完全返回我正在寻找的东西。我不完全确定是否有像 map 或 reduce 这样的函数可以帮助解决这个问题,因为我对 Javascript 还是很陌生。

如果有人能指出我正确的方向,那就太好了。

标签: javascriptarrays

解决方案


这是一个带有map和的示例reduce:)

请注意,您的预期输出无效,因此我对看起来最自然的内容进行了一些调整。

const files = [
    "\\Folder\\file.xlsx",
    "\\Folder\\file2.xlsx",
    "\\Folder\\file3.docx",
    "\\Folder\\Folder2.xlsx",
    "\\Folder\\Folder2\\file4.xlsx",
    "\\Folder\\Folder3\\file5.xlsx",
    "\\Folder\\Folder3\\file6.docx",
    "\\Folder\\Folder4\\file7.pdf"
];

const result = files.map(filePath => 
({
  path: filePath, 
  file: filePath.substring(filePath.lastIndexOf('\\')+1)
})).reduce((acc, item) => {
  const folderPath = item.path.substring(0, item.path.length-(item.file.length+1));
  const folder = folderPath.substring(folderPath.lastIndexOf('\\')+1);
  acc[folder] = acc[folder] || [];
  acc[folder].push(item);
  return acc;
}, {});

console.log(result);

这是一个小解释:

首先,将您的文件转换为预期的对象,然后使用!map重新组织它们。reduce你管这两个mapreduce它正在做这项工作!


推荐阅读