要将具有相同 `name` 属性的对象分组,但按照你的要求输出结构(虽然这种结构在实际应用中并不常见,因为第二个数组中的对象会重复 `name` 值而不是分组),我们可以使用以下 JavaScript 代码:
const items = [
{ id: 1, name: 'fruits' },
{ id: 2, name: 'animals' },
{ id: 3, name: 'fruits' },
];
const groupedById = items.map(item => ({ id: item.id }));
const groupedByName = items.map(item => ({ name: item.name }));
const result = [groupedById, groupedByName];
console.log(result);
然而,如果你的意图是按 `name` 属性分组并仅保留每个组的唯一 `name`,同时保留所有 `id`,一个更合理的输出结构可能是这样的:
const groupedByNameReasonable = items.reduce((acc, item) => {
const nameKey = item.name;
if (!acc[nameKey]) {
acc[nameKey] = { names: [item.name], ids: [item.id] };
} else {
acc[nameKey].ids.push(item.id);
// 注意:这里不添加重复的 name 到 names 数组
}
return acc;
}, {});
// 转换为所需的数组格式(尽管这种格式仍然不是最直观的分组表示)
const resultReasonable = Object.values(groupedByNameReasonable).map(group => {
return [{ names: group.names }, ...group.ids.map(id => ({ id }))];
});
// 但注意,上面的 resultReasonable 结构并不直接符合你的原始要求格式,
// 因为它试图在逻辑上更合理地处理分组(即不重复 name 并列出所有相关 id)。
// 如果严格按照你的要求,我们应该坚持使用最初的 groupedById 和 groupedByName。
对于你的具体需求(即使它可能导致数据冗余),直接使用最初的 `groupedById` 和 `groupedByName` 数组即可。