У меня есть массив объектов; Мне нужно сгруппировать объекты по одинаковым идентификаторам, 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'
}
]
]
I've tries to do it with reduce
это хороший подход, но в приведенном выше коде используется forEach.
Задача ОП относится к категории «группировать и собирать».
Подход всегда один и тот же
Таким образом, что касается решения проблемы ОП
const { id, startDate, endDate } = item;
const groupKey = [id, startDate, endDate].join('_');
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; }
Извините, чувак, я принял твой ответ, но не проверял его.
Где твой код?