Как посчитать вхождения объекта по значению свойства и сохранить количество объектов в новом массиве - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу подсчитать, сколько раз одно и то же значение встречалось внутри объекта, и создать новый объект с добавленным количеством.

Я пытался использовать filter, map и reduceно это не сработало.

У меня есть эти данные:

let arrayOfObjects = [
    {name: 'Disney', type: 'inteira'},
    {name: 'Bottieli', type: 'inteira'},
    {name: 'Monster Truck', type: 'inteira'},
    {name: 'Xuxa', type: 'desconto'},
    {name: 'Pokémon', type: 'zaffari'},
]

И я хочу что-то вроде этого вывода (создать новый объект без повторяющихся элементов на основе клавиши 'type'стоимость и показ количества каждого элемента):

newArrayOfObjects = [
    {name: 'Disney', type: 'inteira', quantity: 3},
    {name: 'Xuxa', type: 'desconto', quantity: 1},
    {name: 'Pokémon', type: 'zaffari', quantity: 1}
]

1 Ответ

0 голосов
/ 07 февраля 2019

Есть несколько способов, которыми это может быть достигнуто.Один из подходов состоит в построении отображения с помощью метода Array#reduce, который отображает каждый type на соответствующий item с данными count, включенными в следующее (обратите внимание, что использование сопоставления подобноэто оптимизация):

  • итерируйте свой входной массив
  • для каждой итерации, сократите ввод до отображения, где key карты - это элемент typevalue является элементом (с количеством)
  • , если в отображении найдено значение для ключа type, увеличьте счетчик соответствующего элемента
  • , если значение для *Ключ 1020 * не найден в отображении, вставьте клон текущего элемента, повторяемого в reduce(), с начальным счетом 1, включенным для этого элемента
  • Передайте отображение, созданное reduce()на Object.values() для извлечения плоских Array предметов с соответствующим количеством, вычисленным во время сокращения

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

let arrayOfObjects = [
    {name: 'Disney', type: 'inteira'},
    {name: 'Bottieli', type: 'inteira'},
    {name: 'Monster Truck', type: 'inteira'},
    {name: 'Xuxa', type: 'desconto'},
    {name: 'Pokémon', type: 'zaffari'},
]

/* Iterate arrayOfObjects and reduce() this to a temporary mapping where item counts
are aggregated. Once that mapping is built, we'll extract values of the mapping to
get the desired array result (ie with items, and type counts) */
let newArrayOfObjects = Object.values(arrayOfObjects.reduce((mapping, item) => {
  
  /* Find exsiting item with matching item type in our mapping */
  const { [item.type]:matchingItem } = mapping;
  
  /* If matching item found, increment the count */
  if(matchingItem) {
    matchingItem.count ++;
  }
  /* Otherwise, insert item into mapping, and also include a starting count of one for it */
  else {
    mapping[ item.type ] = { ...item, count : 1 };
  }
  
  /* Return the updated mapping */
  return mapping;

},{}))

console.log(newArrayOfObjects);

Надеюсь, это поможет: -)

...