Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

230
Vistas
Agrupar elementos de matriz en una secuencia JavaScript

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: Closed

Por favor, ayúdame con un mejor enfoque.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

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>

about 4 years ago · Juan Pablo Isaza Denunciar

0

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));

about 4 years ago · Juan Pablo Isaza Denunciar

0

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:

  1. Obtenga la entrada del día y verifique si tiene el mismo horario que el anterior
  2. si es así, agregue esto al grupo, si no, cree un nuevo grupo

 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>

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda