Задать вопрос
Nolis
@Nolis
it-гопник

Как сосчитать количество повторений в массиве объектов?

Есть массив с объектами следующего вида:
6024e5e150eaf027207951.png
Надо получить новый массив, где повторяющиеся элементы будут заменены на один, дополненный свойством, содержащим количество повторений. Т.е, было [{ name: "cat" }, { name: "cat" }], стало [{ name: "cat", count: 2 }].
  • Вопрос задан
  • 272 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Делаем ровно то, что спрошено:

const result = Object.values(arr.reduce((acc, n) => {
  (acc[n.name] ??= ({ ...n, count: 0 })).count++;
  return acc;
}, {}));

Или, решаем задачу в более общем виде:

function uniqueWithCount(data, key, countKey) {
  const getKey = key instanceof Function ? key : n => n[key];
  const unique = new Map;

  for (const n of data) {
    const k = getKey(n);
    unique.set(k, unique.get(k) ?? { ...n, [countKey]: 0 }).get(k)[countKey]++;
  }

  return unique;
}


const result = [...uniqueWithCount(arr, 'name', 'count').values()];
Ответ написан
Комментировать
MrDecoy
@MrDecoy Куратор тега JavaScript
Верставший фронтендер
Только вот не для фронта эта задача.
const result = {};
const arr = [{ name: "cat" }, { name: "cat" }];

arr.forEach(function(item){
  if(result[item.name]) {
    result[item.name].count += 1;
  } else {
    result[item.name] = {...item, count: 1};
  }
})

console.log(result) // { cat: { name: 'cat', count: 2 } }
console.log(Object.values(result)) // [{ name: "cat", count: 2 }]
console.log(arr) // [{ name: "cat" }, { name: "cat" }];
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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