Tengo una matriz de objetos con fechas que son iguales o diferentes:
const obj = [ {'date': '2021-12-13T02:32:24.911+00:00' 'id' : 'id1' }, {'date': '2021-12-15T02:54:06.248+00:00' 'id' : 'id2' }, {'date': '2021-12-15T02:54:06.248+00:00' 'id' : 'id3' }, {'date': '2021-12-14T02:54:06.248+00:00' 'id' : 'id4' }, {'date': '2021-12-17T02:54:06.248+00:00' 'id' : 'id5' }, {'date': '2021-12-17T02:54:06.248+00:00' 'id' : 'id6' }, ]También tengo una matriz con fechas de la semana actual a partir del sábado:
const weekDates = ['12/11/2021', '12/12/2021', '12/13/2021', '12/14/2021', '12/15/2021', '12/16/2021', '12/17/2021']En última instancia, me gustaría encontrar las mismas fechas en ambas matrices y enviar los objetos identificados de la matriz obj a un nuevo objeto.
const newObject = { 'Sat' : [], 'Sun' : [], 'Mon' : [{'date': '2021-12-13T02:32:24.911+00:00' 'id' : 'id1'}], 'Tue' : [{'date': '2021-12-14T02:54:06.248+00:00' 'id' : 'id4'}], 'Wed' : [{'date': '2021-12-15T02:54:06.248+00:00' 'id' : 'id2'}, {'date': '2021-12-15T02:54:06.248+00:00' 'id' : 'id3'}], 'Thu' : [], 'Fri' : [ {'date': '2021-12-17T02:54:06.248+00:00' 'id' : 'id5'}, {'date': '2021-12-17T02:54:06.248+00:00' 'id' : 'id6'},] }Lo que he probado:
newDates.forEach(weekday => { obj.map(obj => { const date = new Date(obj.date).toLocaleDateString() if(date.includes(weekday)) { // some code here } }) })Puede usar algunos ayudantes, una matriz para los días, un objeto como referencia para los días tomando una parte si la cadena ISO y recopilando todos los datos de sus días.
const weekDates = ['12/11/2021', '12/12/2021', '12/13/2021', '12/14/2021', '12/15/2021', '12/16/2021', '12/17/2021'], days = ['Sat', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri'], objects = [{ date: '2021-12-13T02:32:24.911+00:00', id: 'id1' }, { date: '2021-12-15T02:54:06.248+00:00', id: 'id2' }, { date: '2021-12-15T02:54:06.248+00:00', id: 'id3' }, { date: '2021-12-14T02:54:06.248+00:00', id: 'id4' }, { date: '2021-12-17T02:54:06.248+00:00', id: 'id5' }, { date: '2021-12-17T02:54:06.248+00:00', id: 'id6' }], getISODate = s => s.replace(/^(..)\/(..)\/(....)$/, '$3-$1-$2'), reference = Object.fromEntries( weekDates.map((date, i) => [getISODate(date), days[i]]) ), result = objects.reduce( (r, o) => (r[reference[o.date.slice(0, 10)]].push(o), r), Object.fromEntries(days.map(d => [d, []])) ); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }Para su problema específico, podemos usar Date.prototype.toDateString() para obtener el día de la semana y jugar con él.
const firstArray = [{'date': '2021-12-13T02:32:24.911+00:00','id' : 'id1'}]; const secondArray = ['12/11/2021']; const datesExistsInBothArrays = firstArray.filter(({ date, id } => { const firstArrayDate = new Date(date).valueOf(); for (const secondDate of secondArray) { const secondArrayDate = new Date(secondDate).valueOf(); if (firstArrayDate === secondArrayDate) return true; } return false; }); const result = {}; for (const date of datesExistsInBothArrays) { const day = date.toDateString().split(' ')[0]; if (result[day]) { result[day].push(date); } else { result[day] = [date]; } }Puede hacerlo usando el ayudante forEach de Array y también el ayudante toLocaleDateString de Date , así:
const obj = [ {'date': '2021-12-13T02:32:24.911+00:00', 'id' : 'id1' }, {'date': '2021-12-15T02:54:06.248+00:00', 'id' : 'id2' }, {'date': '2021-12-15T02:54:06.248+00:00', 'id' : 'id3' }, {'date': '2021-12-14T02:54:06.248+00:00', 'id' : 'id4' }, {'date': '2021-12-17T02:54:06.248+00:00', 'id' : 'id5' }, {'date': '2021-12-17T02:54:06.248+00:00', 'id' : 'id6' }, ]; const weekDates = ['12/11/2021', '12/12/2021', '12/13/2021', '12/14/2021', '12/15/2021', '12/16/2021', '12/17/2021']; const days =["Sun","Mon","Tue","Wed","Thu","Fri","Sat"] const newObject= {Sat:[], Sun: [], Mon: [], Tue:[], Wed:[], Thu:[], Fri: []}; obj.forEach(item => { const dateObj = new Date(item.date) if( weekDates.includes( dateObj.toLocaleDateString() ) ){ const day = days[dateObj.getDay()] newObject[day].push(item) } }) console.log(newObject); .as-console-wrapper { max-height: 100% !important; top: 0; }