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