【发布时间】:2021-10-06 07:50:24
【问题描述】:
我正在尝试将数据数组减少为嵌套对象。除了下一个项目,我几乎拥有它。它不会推入数组,而是覆盖整个数组本身,只留下 1 个值。
我 100% 确定问题出在这行代码 [...(acc[t.sub_region] || []), t] 我的直觉告诉我我需要按照 [...(acc[t.region][t.sub_region] || []), t] 的方式做一些事情,但是当我尝试这个时它出错了。
我在下面发布了一个 sn-p,您可以看到 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)
【问题讨论】:
-
如果这是生产代码,我强烈建议使用循环。我相信这个功能将很难调试/维护。使用简单的 for 循环可以消除一些不必要的复杂性
-
@VincentMenzel 我不同意在这种情况下使用循环与减少。我同意这可能会让不熟悉 reduce 功能但可以通过几行文档得到支持的人感到困惑。如果您想向我展示一个使用循环的更简单的解决方案,我很乐意看看
标签: javascript reduce