首页 > 解决方案 > 映射具有任意数量节点的嵌套数组的最简单方法

问题描述

我有一个 JavaScript 数组,其中包含任意数量的节点,其subCategories格式如下。

{
    "maDetails": [{
            "categoryId": 1,
            "category": "Third Party Applications",
            "subCategories": [{
                "categoryId": 5,
                "category": "Third Party Applications6",
                "subCategories": [{
                    "categoryId": 3,
                    "category": "BMC Remedy"
                }]
            }]
        },
        {
            "categoryId": 1,
            "category": "Third Party Applications",
            "subCategories": [{
                "categoryId": 3,
                "category": "Third Party Applications2",
                "subCategories": [{
                    "categoryId": 3,
                    "category": "BMC Remedy"
                }]
            }]
        }
    ]
}

子类别可以是任何数字。我想将所有子类别映射到具有其父类别名称和 ID 的单个数组。最简单的方法是什么?

标签: javascriptarraysjsonmapping

解决方案


使用递归生成器函数。

let data = { "maDetails": [{ "categoryId": 1, "category": "Third Party Applications", "subCategories": [{ "categoryId": 5, "category": "Third Party Applications6", "subCategories": [{ "categoryId": 3, "category": "BMC Remedy" }] }] }, { "categoryId": 1, "category": "Third Party Applications", "subCategories": [{ "categoryId": 3, "category": "Third Party Applications2", "subCategories": [{ "categoryId": 3, "category": "BMC Remedy" }] }] }] }

function* gen(input) {
    for (let item of input) {
        if (!item.subCategories) continue;
        for (let { categoryId, category } of item.subCategories) {
            yield { parentId: item.categoryId, parentCategory: item.category, categoryId, category, }
        }
        yield* gen(item.subCategories)
    }
}

console.log([...gen(data.maDetails)]);


推荐阅读