Как сгруппировать массив по свойству объекта

У меня есть повторяющиеся данные массива. Мне нужен групповой массив

const data = [
    { id: 1, name: "john", cardId: "0001" }, 
    { id: 1, name: "john", cardId: "0001" }, 
    { id: 1, name: "john", cardId: "0002" }, 
    { id: 2, name: "poul", cardId: "0003" },
    { id: 2, name: "poul", cardId: "0003" },
    { id: 2, name: "poul", cardId: "0004" }
];

Мне нужны групповые повторяющиеся данные. Соберитесь вместе и есть только один вот так >>

const res = [ 
    { id: 1, name: "john", card: [{ cardId: "0001" }, { cardId: "0002"} ] },
    { id: 2, name: "poul", card: [{ cardId: "0003" }, { cardId: "0004"} ] } 
];

Спасибо большое за помощь.

Всегда ли данные сортируются по идентификатору/имени?

Kenan Banks 07.05.2019 18:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
49
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

const data =
    [{id: 1, name: 'john', cardId: '0001'}, {id: 1, name: 'john', cardId: '0001'},
      {id: 1, name: 'john', cardId: '0002'}, {id: 2, name: 'poul', cardId: '0003'},
      {id: 2, name: 'poul', cardId: '0003'}, {id: 2, name: 'poul', cardId: '0004'}];

let grouped = data.reduce((acc, {id, name, cardId}) => {
  let d = acc.find(d => d.id === id);
  if (!d)
    acc.push({id, name, card: [cardId]});
  else if (!d.card.includes(cardId))
    d.card.push(cardId);
  return acc;
}, []);

console.info(grouped);
Ответ принят как подходящий

var data = [
	{ id: 1, name: "john", cardId: "0001" }, 
	{ id: 1, name: "john", cardId: "0001" }, 
	{ id: 1, name: "john", cardId: "0002" }, 
	{ id: 2, name: "poul", cardId: "0003" },
	{ id: 2, name: "poul", cardId: "0003" },
	{ id: 2, name: "poul", cardId: "0004" }
];

var res = [];
data.forEach(a => {
	var searchResultInRes = res.find(x => x.id == a.id);
	if (searchResultInRes) {
		if (!searchResultInRes.card.some(x => x.cardId == a.cardId)) {
			searchResultInRes.card.push({ cardId: a.cardId });
		}
	} else {
		res.push({ id: a.id, name: a.name, card: [{ cardId: a.cardId }] });
	}
});

console.info(res);

Вы можете использовать reduce для группировки элементов на основе name. Создайте свойство Set с именем card, чтобы получить уникальные cardId для каждого name. Затем прокрутите набор, чтобы создать вывод

const data = [
    { id: 1, name: "john", cardId: "0001" }, 
    { id: 1, name: "john", cardId: "0001" }, 
    { id: 1, name: "john", cardId: "0002" }, 
    { id: 2, name: "poul", cardId: "0003" },
    { id: 2, name: "poul", cardId: "0003" },
    { id: 2, name: "poul", cardId: "0004" }
];

const merged = data.reduce((r, { id, name, cardId }) => {
  r[name] = r[name] || { id, name, card: new Set };
  r[name].card.add(cardId)
  return r;
}, {})

const output = Object.values(merged).map(({ card, id, name }) => 
        ({ id, name, card: [...card].map(cardID => ({ cardID })) }) )
      
console.info(output)

Другие вопросы по теме