首页 > 解决方案 > 将数据减少到嵌套类别

问题描述

我正在尝试将一组数据减少为嵌套对象。除了下一个项目,我几乎拥有它。它不是推入数组,而是覆盖整个数组本身,只留下 1 个值。

我 100% 确定问题出在这行代码上,[...(acc[t.sub_region] || []), t]我的直觉告诉我我需要做一些事情,[...(acc[t.region][t.sub_region] || []), t]但是当我尝试这个时它会出错。

我在下面发布了一个片段,您可以看到 SOUTH_EUROPE 在它的数组中只有 1 个项目,而它应该有 2 个。

期望的结果

const sorted = {
    EUROPE: {
        SOUTH_EUROPE: [{ item: 'Item 1' }, { item: 'Item 2' }],
        NORTH_EUROPE: [{ item: 'Item 3' }],
    },
    AMERICAS: {
        NORTH_AMERICA: [{ item: 'Item 4' }],
    },
}

const items = [
    {
        region: 'EUROPE',
        sub_region: 'SOUTH_EUROPE',
        item: 'Item 1'
    },
    {
        region: 'EUROPE',
        sub_region: 'SOUTH_EUROPE',
        item: 'Item 2'
    },
    {
        region: 'EUROPE',
        sub_region: 'NORTH_EUROPE',
        item: 'Item 3'
    },
    {
        region: 'AMERICAS',
        sub_region: 'NORTH_AMERCA',
        item: 'Item 4'
    },
]

const sorted = items.reduce((acc, t) => {
    return {
        ...acc,
        [t.region]: {
            ...acc[t.region],
            [t.sub_region]: [...(acc[t.sub_region] || []), t],
        },
    }
}, {})

console.log(sorted)

标签: javascriptreduce

解决方案


sub_region是一个嵌套属性,所以你需要使用acc?.[t.region]?.[t.sub_region]它来访问它。请注意,可选链接运算符用于防止在该区域尚不存在时引发错误。

const items = [
    {
        region: 'EUROPE',
        sub_region: 'SOUTH_EUROPE',
        item: 'Item 1'
    },
    {
        region: 'EUROPE',
        sub_region: 'SOUTH_EUROPE',
        item: 'Item 2'
    },
    {
        region: 'EUROPE',
        sub_region: 'NORTH_EUROPE',
        item: 'Item 3'
    },
    {
        region: 'AMERICAS',
        sub_region: 'NORTH_AMERCA',
        item: 'Item 4'
    },
]

const sorted = items.reduce((acc, t) => {
    return {
        ...acc,
        [t.region]: {
            ...acc[t.region],
            [t.sub_region]: [...(acc?.[t.region]?.[t.sub_region] || []),
                              {item: t.item}],
        },
    }
}, {})

console.log(sorted)


推荐阅读