Сортировка/группировка вложенного обьекта JS / TS

Рейтинг: 0Ответов: 2Опубликовано: 20.06.2023

Сгруппировать объекты по параметру

Пример объекта:

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 } }

Ответы

▲ 1Принят

Вы можете попробовать следующий код. Используйте нужный ключ в переменной 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);

▲ 0

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>