将数据缩减为嵌套类别
Reduce data into nested categories
我正在尝试将数据数组缩减为嵌套对象。除了下一个项目,我几乎拥有它。它没有推入数组,而是覆盖了整个数组本身,只留下 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)
sub_region
是嵌套的属性,所以需要用acc?.[t.region]?.[t.sub_region]
访问。请注意,optional chaining operator 用于防止在该区域尚不存在时抛出错误。
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)
跟进我的评论,推荐更易于管理但“不太干净”的 for 循环。无论如何,我推荐 for loop 的原因是,根据我的经验,没有多少开发人员对 reduce 函数有广泛的了解,尤其是当你的团队中有初级开发人员时。但是我同意好的文档也可以提供必要的信息来维护它。但是,您在阅读函数时无法快速理解函数,这通常意味着变量名称信息不详、过于复杂或缺少文档。
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 categorize = (someItems) => {
const sorted = {}
someItems.forEach(item => {
if (!sorted[item.region]) sorted[item.region] = {}
if (!sorted[item.region][item.sub_region]) sorted[item.region][item.sub_region] = []
sorted[item.region][item.sub_region].push(item)
})
return sorted
}
console.log(categorize(items))
我正在尝试将数据数组缩减为嵌套对象。除了下一个项目,我几乎拥有它。它没有推入数组,而是覆盖了整个数组本身,只留下 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)
sub_region
是嵌套的属性,所以需要用acc?.[t.region]?.[t.sub_region]
访问。请注意,optional chaining operator 用于防止在该区域尚不存在时抛出错误。
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)
跟进我的评论,推荐更易于管理但“不太干净”的 for 循环。无论如何,我推荐 for loop 的原因是,根据我的经验,没有多少开发人员对 reduce 函数有广泛的了解,尤其是当你的团队中有初级开发人员时。但是我同意好的文档也可以提供必要的信息来维护它。但是,您在阅读函数时无法快速理解函数,这通常意味着变量名称信息不详、过于复杂或缺少文档。
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 categorize = (someItems) => {
const sorted = {}
someItems.forEach(item => {
if (!sorted[item.region]) sorted[item.region] = {}
if (!sorted[item.region][item.sub_region]) sorted[item.region][item.sub_region] = []
sorted[item.region][item.sub_region].push(item)
})
return sorted
}
console.log(categorize(items))