首页 > 解决方案 > 将任意数量的可能具有共享元素的数组合并到一个考虑这些共享元素的嵌套字典对象中?

问题描述

我正在尝试从多个数组中编译一个大图“文件夹结构”字典对象,每个数组都包含文件夹名称字符串。一些文件夹/子文件夹名称将在数组之间共享,嵌套字典对象需要反映这一点。

当遍历每个文件夹名称数组以检查嵌套字典对象中是否已经存在“结构”时,我似乎无法弄清楚如何解释以前的文件夹和共享文件夹,考虑到其中可能有任意数量的文件夹每个数组。如果不手动编写无穷无尽的 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": {}
        },
    };

标签: javascriptarraysdictionaryobjectnested

解决方案


好吧,您可以通过多种方式做到这一点。这是我基于递归的解决方案:

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);

推荐阅读