Estoy tratando de agrupar los días de la semana en función del valor de la propiedad en una matriz. He usado lodash para obtener una solución. Mi código se ve así,
const array = [{ weekDay: 'Monday', hoursInfo: '11:00am-8:00pm', }, { weekDay: 'Tuesday', hoursInfo: '11:00am-8:00pm', }, { weekDay: 'Wednesday', hoursInfo: '9:00am-11:00am', }, { weekDay: 'Thursday', hoursInfo: '11:00am-8:00pm', }, { weekDay: 'Friday', hoursInfo: '11:00am-9:00pm', }, { weekDay: 'Saturday', hoursInfo: '11:00am-9:00pm', }, { weekDay: 'Sunday', hoursInfo: 'Closed', }, ]; const result = _.chain(array).groupBy("hoursInfo").value(); document.getElementById("result").innerHTML = JSON.stringify(result); <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script> <div id="result"></div>Puedo agrupar la lista de días de la semana que tienen los mismos horarios, pero mi requisito es agruparlos en una secuencia. Mi salida esperada es algo como esto,
Monday-Tuesday: 11:00am-8:00pm Wedesday: 9:00am-11:00am Thursday: 11:00am-8:00pm Friday-Saturday: 11:00am-9:00pm Sunday: ClosedPor favor, ayúdame con un mejor enfoque.
Reducir funcionará
const newArr = array.reduce((acc, item) => { if (acc.length && acc[acc.length - 1].hoursInfo === item.hoursInfo) { acc[acc.length - 1].weekDay += `- ${item.weekDay}`; } else acc.push(item); return acc; }, []) .map(item => `${item.weekDay}: ${item.hoursInfo}`); console.log(newArr) <script> const array = [ { weekDay: 'Monday', hoursInfo: '11:00am-8:00pm' }, { weekDay: 'Tuesday', hoursInfo: '11:00am-8:00pm' }, { weekDay: 'Wednesday',hoursInfo: '9:00am-11:00am' }, { weekDay: 'Thursday', hoursInfo: '11:00am-8:00pm' }, { weekDay: 'Friday', hoursInfo: '11:00am-9:00pm' }, { weekDay: 'Saturday', hoursInfo: '11:00am-9:00pm' }, { weekDay: 'Sunday', hoursInfo: 'Closed'} ]; </script>Esta solución debería funcionar, avíseme si necesita explicaciones :)
Editar: por alguna razón, no puedo comentar sobre la respuesta de mplungjan, pero su solución no funcionará si hay más de dos días consecutivos con la misma información de horas. Intente reemplazar el horario del miércoles por "11:00 a. m. a 8:00 p. m." y obtendrá: 'Lunes, martes, miércoles, jueves: 11:00 a. m. a 8:00 p. m.'
const array = [{weekDay:"Monday",hoursInfo:"11:00am-8:00pm"},{weekDay:"Tuesday",hoursInfo:"11:00am-8:00pm"},{weekDay:"Wednesday",hoursInfo:"9:00am-11:00am"},{weekDay:"Thursday",hoursInfo:"11:00am-8:00pm"},{weekDay:"Friday",hoursInfo:"11:00am-9:00pm"},{weekDay:"Saturday",hoursInfo:"11:00am-9:00pm"},{weekDay:"Sunday",hoursInfo:"Closed"}]; const getHours = (array) => { let results = []; array.forEach((element, index) => { if(index === 0) return results.push([element.weekDay, element.hoursInfo]); if(element.hoursInfo === results[results.length - 1][1]) { const current = results[results.length - 1][0]; results[results.length - 1][0] = `${current.split('-')[0]}-${element.weekDay}`; } else { results.push([element.weekDay, element.hoursInfo]); } }) return results.map(element => `${element[0]}: ${element[1]}`).join('\n'); } console.log(getHours(array));No creo que haya ninguna función mágica que haga eso. Tienes que implementar dicho algoritmo por ti mismo. Puedes hacer esto en dos pasos:
const group = (data) => { const groups = []; data.forEach((entry) => { if (groups.length === 0) { // initial group groups.push({ days: [entry.weekDay], hours: entry.hoursInfo, }); } else if (groups[groups.length - 1].hours === entry.hoursInfo) { // the same hours groups[groups.length - 1].days.push(entry.weekDay); } else { // create a new group groups.push({ days: [entry.weekDay], hours: entry.hoursInfo, }); } }); return groups; }; const formatDays = (groups) => { return groups.map((group) => ({ days: group.days.length > 1 ? `${group.days[0]}-${group.days[group.days.length - 1]}` : group.days[0], hours: group.hours, })); }; const groupsData = group(array); const formattedGroups = formatDays(groupsData); console.log(formattedGroups); <script> const array = [{ weekDay: 'Monday', hoursInfo: '11:00am-8:00pm', }, { weekDay: 'Tuesday', hoursInfo: '11:00am-8:00pm', }, { weekDay: 'Wednesday', hoursInfo: '9:00am-11:00am', }, { weekDay: 'Thursday', hoursInfo: '11:00am-8:00pm', }, { weekDay: 'Friday', hoursInfo: '11:00am-9:00pm', }, { weekDay: 'Saturday', hoursInfo: '11:00am-9:00pm', }, { weekDay: 'Sunday', hoursInfo: 'Closed', }, ]; </script>