Как преобразовать массив в JS?
У меня есть массив, который вытягивается из базы данных с такой структурой ( пример):
[
{
Receipt_Id: 58,
Subscription_Id: 4,
Count: 2,
User_Id: 3
},
{
Receipt_Id: 58,
Subscription_Id: 5,
Count: 2,
User_Id: 3
},
{
Receipt_Id: 59,
Subscription_Id: 11,
Count: 1,
User_Id: 3
},
...
];
Помогите, пожалуйста, реализовать алгоритм, который преобразует этот массив в вид наподобие:
[
{
Receipt_Id: 58,
Subscription_Id: [4, 5, 6],
Count: [2, 2, 3]
},
{
Receipt_Id: 59,
Subscription_Id: [11, 12, 10, 5],
Count: [1, 2, 2, 2]
},
{
Receipt_Id: 60,
Subscription_Id: [12],
Count: [5]
}
]
Я пишу на JavaScript'е и React'е.
Ответы (1 шт):
Автор решения: Alexander Chernin
→ Ссылка
Можно воспользоваться ассоциативным массивом Map
// Исходный массив
const source = [
{
Receipt_Id: 58,
Subscription_Id: 4,
Count: 2,
User_Id: 3
},
{
Receipt_Id: 58,
Subscription_Id: 5,
Count: 2,
User_Id: 3
},
{
Receipt_Id: 59,
Subscription_Id: 11,
Count: 1,
User_Id: 3
}
];
// Сюда будем складывать результат
const dest = new Map();
source.forEach( s => {
// Если элемента нет в массиве, то добавляем
if (!dest.has(s.Receipt_Id)) {
dest.set(s.Receipt_Id, {
Receipt_Id: s.Receipt_Id,
Subscription_Id: [],
Count: []
});
} else { // Иначе обновляем данные
const v = dest.get(s.Receipt_Id);
v.Subscription_Id.push(s.Subscription_Id);
v.Count.push(s.Count);
dest.set(s.Receipt_Id, v);
}
});
// Вывод
console.log(dest.values());