Пожалуйста, ознакомьтесь с моей скрипкой , которая включает в себя весь следующий код.
Мои извинения, если на этот вопрос уже был дан ответ. Здесь я нашел похожие вопросы о группировке по свойству, но я не нашел пример, где результатом был бы массив объектов.
Я начинаю с этого формата данных:
const originalData = [
{
"groupId": 0,
"color": "red",
"shape": "circle"
},
{
"groupId": 1,
"color": "green",
"shape": "square"
},
{
"groupId": 1,
"color": "orange",
"shape": "hexagon"
},
{
"groupId": 1,
"color": "purple",
"shape": "triangle"
},
{
"groupId": 2,
"color": "aqua",
"shape": "diamond"
},
{
"groupId": 2,
"color": "blue",
"shape": "trapezoid"
}
];
И я хотел бы преобразовать его в новый массив объектов, сгруппированных по значению свойства groupId
:
const desiredData = [
{
"groupId": 0,
"items": [
{
"color": "red",
"shape": "circle"
}
]
},
{
"groupId": 1,
"items": [
{
"color": "green",
"shape": "square"
},
{
"color": "orange",
"shape": "hexagon"
},
{
"color": "purple",
"shape": "triangle"
}
]
},
{
"groupId": 2,
"items": [
{
"color": "aqua",
"shape": "diamond"
},
{
"color": "blue",
"shape": "trapezoid"
}
]
}
];
Эта функция сокращения (которую я нашел в MDN ) ближе всего я смог прийти к преобразованию моих данных. К сожалению, мое понимание Javascript ограничено, и я не уверен, как добавить поля (например, group
) в процессе преобразования. Кроме того, результатом является объект, а не массив объектов.
const actualFormattedData = originalData.reduce((acc, obj) => {
let key = obj['groupId'];
if (!acc[key]) {
acc[key] = [];
}
acc[key].push(obj);
return acc;
}, {});
Вывод из функции сокращения:
{
"0": [
{
"groupId": 0,
"color": "red",
"shape": "circle"
}
],
"1": [
{
"groupId": 1,
"color": "green",
"shape": "square"
},
{
"groupId": 1,
"color": "orange",
"shape": "hexagon"
},
{
"groupId": 1,
"color": "purple",
"shape": "triangle"
}
],
"2": [
{
"groupId": 2,
"color": "aqua",
"shape": "diamond"
},
{
"groupId": 2,
"color": "blue",
"shape": "trapezoid"
}
]
}
Конечная цель состоит в том, чтобы отобразить массив объектов в React. , Я знаю, что могу использовать Object.entries
и индексы массивов для достижения аналогичного результата с actualFormattedData
как есть, но было бы идеально, если бы я мог сначала сделать actualFormattedData
похожим на desiredData
.
Спасибо за ваше время!