@Mirrrta

Как сгруппировать элементы массива?

Есть данные:

[
  { city: 'Москва', address: 'адрес 1' },
  { city: 'Москва', address: 'адрес 2' },
  { city: 'Петербург', address: 'адрес 3' },
  { city: 'Москва', address: 'адрес 4' },
]

Нужно получить данные в таком виде:

[
  { city: 'Москва', address: [ 'адрес 1', 'адрес 2', 'адрес 4' ] },
  { city: 'Петербург', address: [ 'адрес 3' ] },
]

Как такое сделать?
  • Вопрос задан
  • 189 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега React
Функция группировки:

const group = (arr, idKey, valKey) =>
  Object.values(arr.reduce((acc, { [idKey]: id, [valKey]: val }) => (
    (acc[id] = acc[id] ?? { [idKey]: id, [valKey]: [] })[valKey].push(val),
    acc
  ), {}));

В компоненте:

const groupedAddresses = useMemo(() => {
  return group(addresses, 'city', 'address');
}, [ addresses ]);

<ul>
  {groupedAddresses.map(n => (
    <li>
      <h3>{n.city}</h3>
      <ul>{n.address.map(m => <li>{m}</li>)}</ul>
    </li>
  ))}
</ul>

https://jsfiddle.net/vqLsyz0x/
Ответ написан
Комментировать
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
let arr = [
{city: 'Москва', address: 'адрес 1'},
{city: 'Москва', address: 'адрес 2'},
{city: 'Петербург', address: 'адрес 3'},
{city: 'Москва', address: 'адрес 4'},
]

[...new Set(arr.map(item => item.city))].map(function(item) {
   return {city: item, address: arr.filter(itm => itm.city == item).map(itm => itm.address)}
})

5ecbeaac82d5f599457873.png
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@PavelFokeev
pavl1k.ru
Элементарно, пройдясь циклом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы