假设有一个 JavaScript 数组,每个元素都是一个对象,包含了三层分类的数据。我们需要将这个数组中的数据按照三层分类合并成一个新的数组。
举个例子,假设原数组如下:
const dataArray = [
{ category1: 'fruit', category2: 'apple', category3: 'red', name: 'red apple', price: 1.5 },
{ category1: 'fruit', category2: 'apple', category3: 'green', name: 'green apple', price: 1.8 },
{ category1: 'fruit', category2: 'banana', category3: 'yellow', name: 'yellow banana', price: 2.0 },
{ category1: 'vegetable', category2: 'carrot', category3: 'orange', name: 'orange carrot', price: 0.5 },
{ category1: 'vegetable', category2: 'potato', category3: 'white', name: 'white potato', price: 0.8 },
{ category1: 'meat', category2: 'chicken', category3: 'breast', name: 'chicken breast', price: 4.0 },
{ category1: 'meat', category2: 'chicken', category3: 'leg', name: 'chicken leg', price: 3.5 },
{ category1: 'meat', category2: 'beef', category3: 'sirloin', name: 'beef sirloin', price: 6.0 }
];
我们需要将这个数组按照 category1、category2、category3 属性进行分类合并,得到如下新数组:
[
{
category: 'fruit',
subcategories: [
{
category: 'apple',
subcategories: [
{ category: 'red', items: [{ name: 'red apple', price: 1.5 }] },
{ category: 'green', items: [{ name: 'green apple', price: 1.8 }] }
]
},
{
category: 'banana',
subcategories: [
{ category: 'yellow', items: [{ name: 'yellow banana', price: 2.0 }] }
]
}
]
},
{
category: 'vegetable',
subcategories: [
{
category: 'carrot',
subcategories: [
{ category: 'orange', items: [{ name: 'orange carrot', price: 0.5 }] }
]
},
{
category: 'potato',
subcategories: [
{ category: 'white', items: [{ name: 'white potato', price: 0.8 }] }
]
}
]
},
{
category: 'meat',
subcategories: [
{
category: 'chicken',
subcategories: [
{ category: 'breast', items: [{ name: 'chicken breast', price: 4.0 }] },
{ category: 'leg', items: [{ name: 'chicken leg', price: 3.5 }] }
]
},
{
category: 'beef',
subcategories: [
{ category: 'sirloin', items: [{ name: 'beef sirloin', price: 6.0 }] }
]
}
]
}
]
下面是实现代码:
const mergedArray = dataArray.reduce((acc, cur) => {
const existingCategory1 = acc.find(item => item.category === cur.category1);
if (existingCategory1) {
const existingCategory2 = existingCategory1.subcategories.find(item => item.category === cur.category2);
if (existingCategory2) {
const existingCategory3 = existingCategory2.subcategories.find(item => item.category === cur.category3);
if (existingCategory3) {
existingCategory3.items.push({ name: cur.name, price: cur.price });
} else {
existingCategory2.subcategories.push({
category: cur.category3,
items: [{ name: cur.name, price: cur.price }]
});
}
} else {
existingCategory1.subcategories.push({
category: cur.category2,
subcategories: [{
category: cur.category3,
items: [{ name: cur.name, price: cur.price }]
}]
});
}
} else {
acc.push({
category: cur.category1,
subcategories: [{
category: cur.category2,
subcategories: [{
category: cur.category3,
items: [{ name: cur.name, price: cur.price }]
}]
}]
});
}
return acc;
}, []);

与之前的实现类似,这里使用 reduce() 方法对原数组进行遍历,累加器 acc 初始值为空数组。对于每个元素 cur,首先判断其 category1 属性是否已存在于 acc 中,如果存在,则继续往下查找 category2 和 category3 属性;否则,创建一个新的对象,并添加到 acc 中。在查找过程中,每一层的处理逻辑类似,如果已存在对应的分类,则将该元素添加到 items 数组中;否则,创建一个新的对象,并添加到对应的 subcategories 数组中。最后返回累加器 acc。
#挑战30天在头条写日记#