EDIT: исправлено, чтобы отфильтровать повторяющиеся DateTimes с сохранением соответствующего порядка с помощью Set () строк DateTime
Примечание: необязательное связывание ?.
требует Chrome 80+ и Safari 13+. Используйте тройную проверку на неопределенность, если вам нужна совместимость.
Используйте карту объектов для отслеживания повторяющегося идентификатора, объедините с массивом времени, если он найден.
userData = [{id:'101', Time:'3:00pm', Date:'5/25/20'},
{id:'101', Time:'5:00pm', Date:'5/25/20'},
{id:'101', Time:'5:00pm', Date:'6/25/20'},
{id:'105', Time:'1:00pm', Date:'3/25/20'},
{id:'105', Time:'5:00pm', Date:'5/25/20'}
]
console.log(
Object.values(
userData.reduce((acc,{Time, id, Date})=>
// [id] exists and does not contain DateTime
acc[id]?.TD?.has(`${Date}_${Time}`)!== true ?
Object.assign(acc, {[id]:{
id,
TD: (acc[id]?.TD||new Set()).add(`${Date}_${Time}`),
Time: (acc[id]?.Time||[]).concat(Time),
Date: (acc[id]?.Date||[]).concat(Date)
}})
: acc,{})
)
// get rid of TD Set, used only to prevent dupes
.map(({TD, ...o})=>o)
)