javascript - 将任意数量的可能具有共享元素的数组合并到一个考虑这些共享元素的嵌套字典对象中?
问题描述
我正在尝试从多个数组中编译一个大图“文件夹结构”字典对象,每个数组都包含文件夹名称字符串。一些文件夹/子文件夹名称将在数组之间共享,嵌套字典对象需要反映这一点。
当遍历每个文件夹名称数组以检查嵌套字典对象中是否已经存在“结构”时,我似乎无法弄清楚如何解释以前的文件夹和共享文件夹,考虑到其中可能有任意数量的文件夹每个数组。如果不手动编写无穷无尽的 for 循环,你怎么能解释这个任意数字呢?
这是数组可能是什么样子的基本示例:
var test1 = ["sub1", "sub2", "sub3"];
var test2 = ["sub1", "other"];
var test3 = ["sub0", "misc"];
var test4 = ["sub1", "sub2", "proj", "img"];
这是基于上述示例的所需输出:
var folder_structure = {
"sub0": {
"misc": {}
},
"sub1": {
"sub2": {
"sub3": {},
"proj": {
"img": {}
}
},
"other": {}
},
};
解决方案
好吧,您可以通过多种方式做到这一点。这是我基于递归的解决方案:
var test1 = ["sub1", "sub2", "sub3"];
var test2 = ["sub1", "other"];
var test3 = ["sub0", "misc"];
var test4 = ["sub1", "sub2", "proj", "img"];
const arrays = [test1, test2, test3, test4]; // just organizing all together
const addFolders = (root, folders) => {
// let the base case for recursion be an empty folders array
if (!folders.length) return root;
const curFolderName = folders[0];
const newFolder = root[curFolderName] || {};
root[curFolderName] = newFolder;
// recursive call:
return addFolders(root[curFolderName], folders.slice(1));
}
// here you can also use an empty object as temp
// result-storage and a simple for or forEach loop
// instead of reduce method (up to your taste).
const result = arrays.reduce((acc, folders) => addFolders(acc, folders) && acc, {})
console.dir(result);
推荐阅读
- amazon-web-services - lambda 函数仅针对文件名模式的上传触发
- c++ - 无法捕获 ImageMagick Image 构造函数异常
- python-3.x - 在 Python 脚本中将输出扩展到前 5 个电子邮件地址(从前 1 个)
- asp.net-core - 具有可选导航的 EF Core 中的自有类型
- c++ - 在编译时通过模板参数和 constexpr 语义生成浮点限制:
- vim - 修复 Tmux 中错误绑定的键
- c++ - 重载 operator= 用于 char*
- django - jwt 令牌授权无法与自定义角色一起正常工作
- html - 如何在数据表 jquery 中进行如下图所示的分页设计
- java - 可完成的未来浪费更多时间?