Перестройте массив с loda sh, используя _.map и ._groupBy - PullRequest
2 голосов
/ 30 апреля 2020

Я ищу реструктуризацию массива объектов с помощью loda sh.

Я безуспешно пытался адаптировать множество примеров, найденных в Интернете. Кажется, мне пришлось бы использовать комбинацию _.map и ._groupBy, но я не могу по-настоящему обдумать это.

Любая помощь приветствуется!

Исходный массив :

const entries = [
  {
    year: '2019',
    children: [
      { name: 'red', amount: 1, label: 'color' },
      { name: 'yellow', amount: 20, label: 'color' },
      { name: 'green', amount: 12, label: 'color' },
    ],
  },
  {
    year: '2020',
    children: [
      { name: 'red', amount: 1, label: 'color' },
      { name: 'yellow', amount: 3, label: 'color' },
    ],
  },
]

Реструктурированный массив :

[
  {
    id: 'red',
    data: [
      { year: '2019', amount: 1 },
      { year: '2020', amount: 1 },
    ],
  },
  {
    id: 'yellow',
    data: [
      { year: '2019', amount: 20 },
      { year: '2020', amount: 3 },
    ],
  },
  {
    id: 'green',
    data: [
      { year: '2019', amount: 12 },
    ],
  },
]

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Вы можете объединить все операции с помощью flatMap, groupBy и сопоставления.

const entries = [{ year: '2019', children: [{ name: 'red', amount: 1, label: 'color' }, { name: 'yellow', amount: 20, label: 'color' }, { name: 'green', amount: 12, label: 'color' }] }, { year: '2020', children: [{ name: 'red', amount: 1, label: 'color' }, { name: 'yellow', amount: 3, label: 'color' }] }],
    result = _(entries)
        .flatMap(({ year, children }) => _.map(children, ({ name: id, amount }) => ({ year, id, amount })))
        .groupBy('id')
        .map((data, id) => ({ id, data: _.map(data, ({ year, amount }) => ({ year, amount })) }))
        .value();

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
0 голосов
/ 30 апреля 2020

Вероятно, существует довольно много разных способов сделать это, однако я считаю, что лучший подход:

  1. Свести потомков в один массив.
  2. Использовать _.groupBy чтобы создать карту этих записей, используя имя.
  3. Используйте _.entries, чтобы получить массив ключей и значений для карты.
  4. Наконец, используйте _.map, чтобы преобразовать эти записи в наш желаемый вывод.

const entries = [
  {
    year: '2019',
    children: [
      { name: 'red', amount: 1, label: 'color' },
      { name: 'yellow', amount: 20, label: 'color' },
      { name: 'green', amount: 12, label: 'color' },
    ],
  },
  {
    year: '2020',
    children: [
      { name: 'red', amount: 1, label: 'color' },
      { name: 'yellow', amount: 3, label: 'color' },
    ],
  },
]

// Step 1
let flattenedChildren = _.flatMap(entries, e => e.children.map(c => { return { ...c, year: e.year } }));

// Step 2
let entryMap =  _.groupBy(flattenedChildren , "name");

// Step 3
let mapEntries = _.entries(entryMap);

// Step 4
let result = _.map(mapEntries , ([id, items]) => { return { id, data: items.map(item => _.pick(item, ["amount", "year"]))} });

console.log("Result:", result);
   
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script> 
...