📅  最后修改于: 2023-12-03 15:39:14.940000             🧑  作者: Mango
在 JavaScript 中,我们可以使用 Array.reduce() 方法来将具有相同名称的所有项目分组。这个方法接收两个参数,第一个是回调函数,第二个是初始值。
回调函数接收两个参数:累加器和当前值。在这个问题中,累加器应该是一个对象,用于存储不同名称的项目列表。当前值是数组中的每个项目。
function groupByName(accumulator, currentValue) {
const key = currentValue.name;
if (!accumulator[key]) {
accumulator[key] = [];
}
accumulator[key].push(currentValue);
return accumulator;
}
这个函数首先检查累加器对象中是否已经有当前项目名称的属性。如果没有,它会在对象中创建一个新属性,并将一个空数组分配给它。接下来,它将当前项目添加到该数组中,并返回累加器对象。
默认情况下,reduce() 方法使用数组中的第一个元素作为初始值。但是,在这个问题中,我们需要一个空对象作为初始值。
const array = [
{ name: 'apple', id: 1 },
{ name: 'orange', id: 2 },
{ name: 'apple', id: 3 },
{ name: 'banana', id: 4 },
{ name: 'orange', id: 5 }
];
const result = array.reduce(groupByName, {});
这个例子中,我们有一个数组,其中包含一些具有名称和 ID 的项目。我们想要按名称对它们进行分组。我们调用 reduce() 方法,将 groupByName 函数作为回调函数传递,并将空对象作为初始值传递。reduce() 方法返回一个对象,其中包含按名称分组的所有项目。例如,如果我们调用 console.log(result.apple),它将输出一个数组,其中包含 ID 为 1 和 3 的项目。
这是一个完整的代码片段:
const array = [
{ name: 'apple', id: 1 },
{ name: 'orange', id: 2 },
{ name: 'apple', id: 3 },
{ name: 'banana', id: 4 },
{ name: 'orange', id: 5 }
];
function groupByName(accumulator, currentValue) {
const key = currentValue.name;
if (!accumulator[key]) {
accumulator[key] = [];
}
accumulator[key].push(currentValue);
return accumulator;
}
const result = array.reduce(groupByName, {});
// result:
// {
// apple: [
// { name: 'apple', id: 1 },
// { name: 'apple', id: 3 }
// ],
// orange: [
// { name: 'orange', id: 2 },
// { name: 'orange', id: 5 }
// ],
// banana: [
// { name: 'banana', id: 4 }
// ]
// }