Сортировка/группировка вложенного обьекта JS / TS
Сгруппировать объекты по параметру
Пример объекта:
itCameFromTheServer = [
{ id: 1, info: { a: 1, b: {c : 3} } },
{ id: 2, info: { a: 2, b: {c : 3} } },
{ id: 3, info: { a: 2, b: {c : 3} } }
]
Ожидаемый результат при сортировке по параметру info.a:
itCameFromTheServerSort = {
1: { id: 1, info: { a: 1, b: {c : 3} } },
2: [
{ id: 2, info: { a: 2, b: {c : 3} } },
{ id: 3, info: { a: 2, b: {c : 3} } }
]
}
Ожидаемый результат при сортировке по параметру info.b.c:
itCameFromTheServerSort = {
3:[
{ id: 1, info: { a: 1, b: {c : 3} } },
{ id: 2, info: { a: 2, b: {c : 3} } },
{ id: 3, info: { a: 2, b: {c : 3} } }
]
}
Получилось приблизиться к похожей сортировке, только при плоском объекте
const itCameFromTheServer = [
{ id: 1, info: 1 },
{ id: 2, info: 2 },
{ id: 2, info: 2 }
]
const newUsers = {};
users.forEach(user => {
newUsers[user.info] = user;
});
Результат:
{ '1': { id: 1, info: 1 }, '2': { id: 2, info: 2 } }
Ответы (2 шт):
Автор решения: Александр Окостень
→ Ссылка
Вы можете попробовать следующий код. Используйте нужный ключ в переменной key:
const itCameFromTheServer = [
{ id: 1, info: { a: 1, b: { c: 3 } } },
{ id: 2, info: { a: 2, b: { c: 3 } } },
{ id: 3, info: { a: 2, b: { c: 3 } } }
];
const itCameFromTheServerSort = {};
itCameFromTheServer.forEach((item) => {
const key = item.info.b.c;
if (itCameFromTheServerSort[key]) {
itCameFromTheServerSort[key].push(item);
} else {
itCameFromTheServerSort[key] = [item];
}
});
console.log(itCameFromTheServerSort);
Автор решения: nörbörnën
→ Ссылка
const data = [
{ id: 1, info: { a: 1, b: {c : 3} } },
{ id: 2, info: { a: 2, b: {c : 3} } },
{ id: 3, info: { a: 2, b: {c : 3} } }
];
console.log(transform(data, 'info.a'));
console.log(transform(data, 'info.b.c'));
console.log(transform(data, 'id'));
function transform(inputData, inputPath) {
const acc = new Map();
const path = inputPath.split('.');
inputData.forEach((x) => {
const key = R.path(path, x);
if (!acc.has(key)) {
acc.set(key, []);
}
acc.get(key).push(x);
});
return Object.fromEntries(acc);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.29.0/ramda.min.js"></script>