Массив объектов js. Соединить объекты по значению

Всех приветствую. У меня есть динамический массив объектов

data = [
  {
    name: alex,
    date: 24/09/2022
    ip:222.222.43.42
  },
  {
    name: alex,
    date: 27/09/2022
    ip:222.222.43.41
  },
  {
    name: sam,
    date: 26/09/2022
    ip:222.222.43.40
  },
  {
    name: sam,
    date: 24/09/2022
    ip:222.222.43.32
  },

  {
    name: sam,
    date: 24/09/2022 
    ip:222.222.43.31
  },
]

Я хочу получить следующий результат

data = [
  {
    name: alex,
    date: [24/09/2022,27/09/2022]
    ip:[222.222.43.40,222.222.43.41,222.222.43.42]
  },
  {
    name: sam,
    date: [26/09/2022,28/09/2022,24/09/2022]
    ip:[222.222.43.32,222.222.43.31]
  },
]

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


Ответы (1 шт):

Автор решения: Sergey Glazirin

const data = [{
    name: 'alex',
    date: '24/09/2022',
    ip: '222.222.43.42',
  },
  {
    name: 'alex',
    date: '27/09/2022',
    ip: '222.222.43.41',
  },
  {
    name: 'sam',
    date: '26/09/2022',
    ip: '222.222.43.40',
  },
  {
    name: 'sam',
    date: '24/09/2022',
    ip: '222.222.43.32',
  },
  {
    name: 'sam',
    date: '24/09/2022',
    ip: '222.222.43.31',
  },
];

// получаем список уникальных имен
const uniqueName = [...new Set(data.map(item => item.name))];

const result = uniqueName.map(name => {
  // получаем список данных, где есть имя
  const itemsByName = data.filter(element => element.name === name);

  // формируем объект для каждого имени
  return {
    name,
    date: [...new Set(itemsByName.map(element => element.date))],
    ip: [...new Set(itemsByName.map(element => element.ip))],
  }
})

console.log(result);

→ Ссылка