Фильтрация массивов объектов на основе уникальных значений - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть массив объектов, которые необходимо отфильтровать. Структура объекта выглядит следующим образом:

[
    {
        name: 'Wheat',
        group: { name: 'Grains' }
    }, {
        name: 'Rice',
        group: { name: 'Grains' }
    }, {
        name: 'corn',
        group: { name: 'Grains' }
    }, {
        name: 'Oats',
        group: { name: 'Grains' }
    }, {
        name: 'Live Cattle',
        group: { name: 'Livestock/meat products' }
    }, {
        name: 'pork Bellies',
        group: { name: 'Livestock/meat products' }
    }
]

Мне нужно что-то подобное, чтобы отобразить на GUI. Разделяйте массив по имени группы. Поскольку имена групп будут уникальными, но каждая группа может иметь несколько вариантов выбора.

Поэтому я хочу создать HashMap, в котором ключ является именем группы, а Значение - именем. HashMap будет выглядеть следующим образом:

{
    'Grains':                  'Oats',
    'Grains':                  'Wheat',
    'Grains':                  'corn',
    'Livestock/meat products': 'Live Cattle',
    'Livestock/meat products': 'pork Bellies'
}

Как этого добиться, используя функции массива, или мне нужно иметь отдельный лог c для создания HashMap?

спасибо,

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Это идеальный способ сделать. Передавайте свои данные при вызове этой функции.

function formatData(data) {
  const formattedData = {}
  data.forEach(({name, group}) => {
    formattedData[group.name] = formattedData[group.name] ? formattedData[group.name].concat(name) : [name];
  });
  return formattedData;
}
0 голосов
/ 10 февраля 2020

Вы не можете создать карту с дубликатами ключей. Таким образом, вы можете заменить ключ и значение, и тогда это будет возможно, например:

const
  data = [
      {
          name: 'Wheat',
          group: { name: 'Grains' }
      }, {
          name: 'Rice',
          group: { name: 'Grains' }
      }, {
          name: 'corn',
          group: { name: 'Grains' }
      }, {
          name: 'Oats',
          group: { name: 'Grains' }
      }, {
          name: 'Live Cattle',
          group: { name: 'Livestock/meat products' }
      }, {
          name: 'pork Bellies',
          group: { name: 'Livestock/meat products' }
      }
  ],
  result = data.map(({ name, group }) => [name, group.name]),
  resultAsMap = new Map(result);

В качестве альтернативы, вы можете создать набор строк, если вам это поможет, например:

  result = new Set(data.map(({ name, group }) => `${group.name}: ${name}`));

Вы также можете сделать «группировка по», которая кажется более подходящей для вашего случая:

  reducer = (map, { name, group }) => map.set(group.name, (map.get(group.name) || []).concat(name)),
  result = data.reduce(reducer, new Map);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...