Как сгруппировать массив объектов по одинаковым значениям идентификатора и даты?

У меня есть массив объектов; Мне нужно сгруппировать объекты по одинаковым идентификаторам, startDates и endDates. Если идентификаторы совпадают, но startdate или endDate НЕ совпадают - не группируйте их. Если startDates или endDates совпадают, а идентификаторы НЕ совпадают - не группируйте их. Я пытаюсь сделать это с помощью сокращения, но не могу понять, как это сделать.

Как это сделать ?

Мой код:

const newDates: any[] = [];
    response.forEach((elem, index) => {
        if (newDates.length === 0) newDates.push([elem])

        if (newDates.length > 0) {
            if (
                newDates[index][0].startDate === elem.startDate
                && newDates[index][0].endDate === elem.endDate
                && newDates[index][0].id === elem.id
            ) {
                newDates[index].push(elem)
            } else {
                newDates.push([elem])
            }
        }
    })

Пример:

    const response = [
        {
            name: 'John',
            id: 1,
            startDate:'2022-10-31T00:00:00',
            endDate: '2022-12-01T00:00:00'
        },
        {
            name: 'Alisha',
            id: 1,
            startDate:'2022-10-31T00:00:00',
            endDate: '2022-12-01T00:00:00'
        },
        {
            name: 'Andrew',
            id: 4,
            startDate:'2022-10-05T00:00:00',
            endDate: '2022-11-01T00:00:00'
        },
        {
            name: 'James',
            id: 4,
            startDate:'2022-10-05T00:00:00',
            endDate: '2022-11-01T00:00:00'
        },
        {
            name: 'Kamilla',
            id: 4,
            startDate:'2022-11-14T00:00:00',
            endDate: '2022-11-18T00:00:00'
        },
        {
            name: 'Oliver',
            id: 4,
            startDate:'2022-11-13T00:00:00',
            endDate: '2022-11-18T00:00:00'
        }
    ]

И результат должен быть

  const result = [
        [
            {
                name: 'John',
                id: 1,
                startDate:'2022-10-31T00:00:00',
                endDate: '2022-12-01T00:00:00'
            },
            {
                name: 'Alisha',
                id: 1,
                startDate:'2022-10-31T00:00:00',
                endDate: '2022-12-01T00:00:00'
            },
        ],
        [
            {
                name: 'Andrew',
                id: 4,
                startDate:'2022-10-05T00:00:00',
                endDate: '2022-11-01T00:00:00'
            },
            {
                name: 'James',
                id: 4,
                startDate:'2022-10-05T00:00:00',
                endDate: '2022-11-01T00:00:00'
            },
        ],
        [
            {
                name: 'Kamilla',
                id: 4,
                startDate:'2022-11-14T00:00:00',
                endDate: '2022-11-18T00:00:00'
            }
        ],
        [
            {
                name: 'Oliver',
                id: 4,
                startDate:'2022-11-13T00:00:00',
                endDate: '2022-11-18T00:00:00'
            }
        ]
    ]

Где твой код?

Konrad 10.11.2022 16:22
I've tries to do it with reduce это хороший подход, но в приведенном выше коде используется forEach.
James 10.11.2022 16:29
Поведение ключевого слова "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) для оценки ваших знаний,...
1
2
109
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Задача ОП относится к категории «группировать и собирать».

Подход всегда один и тот же

  1. создать объект (индекс/карту) ...
  2. где группа представлена ​​записью с ключом, уникальным для группы, которую она представляет, и где значение представляет собой массив (которые должны быть) сгруппированы и собраны элементы.

Таким образом, что касается решения проблемы ОП

  1. уменьшить массив элементов с начальным значением, которое служит таким индексом.
  2. для каждого шага итерации получить данные, которые делают элемент принадлежащим уникальной группе... здесь... const { id, startDate, endDate } = item;
  3. создайте уникальный ключ, который ссылается либо на существующую, либо на создаваемую группу... здесь... const groupKey = [id, startDate, endDate].join('_');
  4. создать и/или получить доступ к группе с помощью созданного ключа с помощью оператора присваивания нулевого объединения (x ??= y)
  5. ... и поместите элемент в массив групп.
  6. передать программно построенный index на следующий шаг итерации или вернуть его как окончательный результат... return index;

Поскольку результатом функции редуктора является объект, в котором сгруппированные массивы OP представлены как значения его пар ключ-значение, этот объект должен быть обработан Object.values ​​, чтобы точно соответствовать ожидаемой структуре данных OP (массив массивов товара(ов)).

function groupAndCollectItemBySameIdAndDate(index, item) {
  const { id, startDate, endDate } = item;
  const groupKey = [id, startDate, endDate].join('_');

  (index[groupKey] ??= []).push(item);

  return index;
}

const sampleData =   [{
  name: 'John',
  id: 1,
  startDate:'2022-10-31T00:00:00',
  endDate: '2022-12-01T00:00:00'
}, {
  name: 'Alisha',
  id: 1,
  startDate:'2022-10-31T00:00:00',
  endDate: '2022-12-01T00:00:00'
}, {
  name: 'Andrew',
  id: 4,
  startDate:'2022-10-05T00:00:00',
  endDate: '2022-11-01T00:00:00'
}, {
  name: 'James',
  id: 4,
  startDate:'2022-10-05T00:00:00',
  endDate: '2022-11-01T00:00:00'
}, {
  name: 'Kamilla',
  id: 4,
  startDate:'2022-11-14T00:00:00',
  endDate: '2022-11-18T00:00:00'
}, {
  name: 'Oliver',
  id: 4,
  startDate:'2022-11-13T00:00:00',
  endDate: '2022-11-18T00:00:00'
}];

const groupedData = sampleData
  .reduce(groupAndCollectItemBySameIdAndDate, {});

const expectedResult = Object.values(groupedData);

console.info({
  groupedData: structuredClone?.(groupedData) ?? groupedData,
  expectedResult: structuredClone?.(expectedResult) ?? expectedResult,
});
.as-console-wrapper { min-height: 100%!important; top: 0; }

Извините, чувак, я принял твой ответ, но не проверял его.

Александр Мерный 17.11.2022 10:33

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