Как отсортировать массив объектов, чтобы объединить все объекты с определенным ключом? /JavaScript
Есть масcив вида:
[{
"def": 900,
"from": 100000,
"before": 199999,
},
{
"def": 900,
"from": 200000,
"before": 299999,
},
{
"def": 901,
"from": 111111,
"before": 222222,
} ...]
Как его отсортировать по ключу def, чтобы получить только уникальные def, но со всеми значениями from и before, т.е. из них получить массив из значений всех таких объектов.
Получиться должен массив:
[{
"def": 900,
"from": [100000, 200000, ...]
"before": [199999, 299999, ...]
},
{
"def": 901,
"from": [111111, 222222, ...]
"before": [222222, 333333, ...]
}, ...]
Ответы (2 шт):
Автор решения: Zhihar
→ Ссылка
вам не отсортировать надо, а пересобрать, т.е. вам надо
пройти по всем элементам списка
записывать данные как в словарь
2.1) если ключ def уже существует, то добавлять записи в поля from и before,
2.2) если ключ def не существует, то добавлять сразу всю структуру (с def, from, before)
кстати раз у вас from, before - это массивы, а не значения, то не лучше ли объединить данные в пары и записывать в виде
data: [[11, 22], [33, 44]]
и т.д. или как
data: [{'after': 11, 'before': 22}, {'after': 33, 'before': 44}]
Автор решения: Aziz Umarov
→ Ссылка
Как-то так думаю.
- Сортируете по ключу def, если равны то по from если равны то по before
- reduce по массиву и строим искомый объект. Если существует то добавляем новый элемет в существующий. Если нет его в результате то добавляем новый предварительно подготовивв объект
let array = [{
"def": 900,
"from": 1000000,
"before": 199999,
},
{
"def": 900,
"from": 200000,
"before": 299999,
},
{
"def": 901,
"from": 111111,
"before": 222222,
}];
let result = array
.sort((a, b)=> a.def != b.def? a.def - b.def: a.from != b.from? a.from - b.from: a.before - b.before)
.reduce( (acc, item) => {
let key = acc.find(i => i.def == item.def);
if (key != null) {
key.from.push(item.from);
key.before.push(item.before);
} else {
acc.push({def: item.def, from: [item.from], before: [item.before]});
}
return acc;
}, []);
console.log(result);