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

155
Vistas
Filtrar matriz comparando valores de propiedad

Ok, tengo una matriz de la siguiente manera

 const services = [ { "data":[ { "duration":{ "start":"10", "end":"11" }, "serviceId":215 }, { "duration":{ "start":"4", "end":"5" }, "serviceId":37 }, ], "title":"1632767400000" }, { "data":[ { "duration":{ "start":"9", "end":"11" }, "serviceId":215 }, { "duration":{ "start":"2", "end":"3" }, "serviceId":37 }, ], "title":"1632767400000" }, ]

Como puede ver, tengo otra matriz ( data ) dentro de mi matriz principal que tiene varios objetos.

quiero filtrar estos datos, por ejemplo, quiero obtener datos que tengan una duración inicial y final entre 9 y 11.

Entonces mi resultado final de los datos filtrados debe ser el siguiente

 const services = [ { "data":[ { "duration":{ "start":"10", "end":"11" }, "serviceId":215 }, ], "title":"1632767400000" }, { "data":[ { "duration":{ "start":"9", "end":"11" }, "serviceId":215 }, ], "title":"1632767400000" }, ]

He intentado algo como lo siguiente

 const test = services.map((item) => { return item.data.filter((service) => { return ( parseInt(service.duration.start) >= 9 && parseInt(service.duration.end) <= 11 ); }); });

Pero solo devuelve la matriz de elementos data y no la matriz completa como necesito. ¿Cómo filtro matrices de data en mi matriz principal y mantengo la estructura original de la matriz principal?

FYI: cualquier solución lodash también es bienvenida.

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

0

services es una matriz de objetos, por lo que primero debe mapear la matriz y devolver un objeto con todas las propiedades como ...o y data con objetos filtrados cuya duration.start <= 11

 services.map((o) => ({ ...o, data: o.data.filter( (obj) => +obj.duration.start >= 9 && +obj.duration.end <= 11 ), })); 

 const services = [ { data: [ { duration: { start: "10", end: "11", }, serviceId: 215, }, { duration: { start: "4", end: "5", }, serviceId: 37, }, ], title: "1632767400000", }, { data: [ { duration: { start: "9", end: "11", }, serviceId: 215, }, { duration: { start: "2", end: "3", }, serviceId: 37, }, ], title: "1632767400000", }, ]; const result = services.map((o) => { return { ...o, data: o.data.filter((obj) => +obj.duration.start >= 9 && +obj.duration.end <= 11), }; }); console.log(result);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Sus datos de respuesta se ocupan solo del nodo de data en la matriz de servicios.

Depurando su función de mapa

 services.map((item) => { return item.data.filter((service) => { return ( parseInt(service.duration.start) >= 9 && parseInt(service.duration.end) <= 11 ); }); });

Su función de mapa recorre la matriz de services . Al hacer un bucle en la matriz, filtra el nodo de datos y verifica la condición y devuelve los nodos de datos que satisfacen esa condición. Tenga en cuenta que vuelve a mostrar solo los nodos de datos

Debe enviar no solo los nodos de datos, debe usar todos los nodos en cada matriz de objetos de services . Esto se puede hacer usando un operador de propagación como {data, ...restNodes} . Aquí, cada objeto de la matriz de services se dividirá en dos conjuntos. El nodo de data de cada objeto estará disponible en la variable llamada data y el resto de las variables estarán disponibles en la variable restNodes .

Entonces, en el mapa, devuelva la acción de filtro en el nodo de data , así como la variable restNodes . Entonces esto dará todos los datos en cada nodo de la matriz de services y los datos filtrados del nodo de data .

 const services = [ { "data": [ { "duration": { "start": "10", "end": "11" }, "serviceId": 215 }, { "duration": { "start": "4", "end": "5" }, "serviceId": 37 }, ], "title": "1632767400000" }, { "data": [ { "duration": { "start": "9", "end": "11" }, "serviceId": 215 }, { "duration": { "start": "2", "end": "3" }, "serviceId": 37 }, ], "title": "1632767400000" }, ]; const output = services.map(({data, ...restNodes}) => { return { data: data.filter((service) => { return ( parseInt(service.duration.start) >= 9 && parseInt(service.duration.end) <= 11 ); }), ...restNodes, }; }); console.log(output);

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