Quiero filtrar la matriz de objetos anidados en javascript.
Obtuve la siguiente respuesta de otra pregunta .
var sampleData= [{ "rowId": "3.0.0", "startDate": "2020-10-20", "subTasks": [ { "rowId": "3.3.0", "startDate": "2021-05-26", "subTasks": [ { "rowId": "3.3.0.1", "startDate": "2021-05-26", "subTasks": [] }, { "rowId": "3.3.0.2", "startDate": "2021-06-09", "endDate": "2021-07-23", "subTasks": [] }, ] }, ] }] filtered = sampleData.map(element => { return { ...element, subTasks: element.subTasks.filter(subElement => { return subElement.endDate }) } }) console.log("sampleData",JSON.stringify(filtered))Quiero archivar según la fecha de finalización. Salida esperada: es necesario filtrar el objeto con ID de fila "3.3.0.2".
Este código está filtrando solo hasta 2 niveles. Pero en mi caso los objetos anidados pueden crecer hasta 10 niveles. ¿Cómo puedo filtrar la matriz de objetos hasta n niveles?
Puede hacerlo con una función recursiva y recorrer solo las subtareas válidas. No creo que necesite mucha explicación, suponiendo que sepa qué es una función recursiva (y supongo que sí):
function recurseOnSubTasks(elem) { const filteredSubTasks = elem.subTasks .filter(subTask => !subTask.endDate) .map(subTask => recurseOnSubTasks(subTask)) return { ...elem, subTasks: filteredSubTasks } }Y luego llamarlo con:
sampleData.map(elem => recurseOnSubTasks(elem)) var sampleData= [{ "rowId": "3.0.0", "startDate": "2020-10-20", "subTasks": [ { "rowId": "3.3.0", "startDate": "2021-05-26", "subTasks": [ { "rowId": "3.3.0.1", "startDate": "2021-05-26", "subTasks": [] }, { "rowId": "3.3.0.2", "startDate": "2021-06-09", "endDate": "2021-07-23", "subTasks": [] }, ] }, ] }]; function recurseOnSubTasks(elem) { const filteredSubTasks = elem.subTasks .filter(subTask => !subTask.endDate) .map(subTask => recurseOnSubTasks(subTask)) return { ...elem, subTasks: filteredSubTasks } } console.log(sampleData.map(elem => recurseOnSubTasks(elem)));Si desea filtrar según la fecha de finalización, puede usar el método forEach y colocarlo en un objeto y luego llegar al resultado deseado. Espero que esto funcione.
var sampleData= [{ "rowId": "3.0.0", "startDate": "2020-10-20", "subTasks": [ { "rowId": "3.3.0", "startDate": "2021-05-26", "subTasks": [ { "rowId": "3.3.0.1", "startDate": "2021-05-26", "subTasks": [] }, { "rowId": "3.3.0.2", "startDate": "2021-06-09", "endDate": "2021-07-23", "subTasks": [] }, ] }, ] }] sampleData.forEach((obj)=> { obj.subTasks.forEach((prop) => { const newObj = {name: prop}; console.log(newObj.name.subTasks[1]); console.log(newObj.name.subTasks[1].endDate); }) })puedes hacerlo usando la recursividad. La matriz de valores contendrá todas las tareas, luego puede filtrar en cualquier propiedad que desee.
var values = []; function GetValues(samples){ if(samples != [] && samples != undefined && samples != null){ for(var sample of samples){ values.push(sample) GetValues(sample.subTasks) } }else{ return {}; } } GetValues(sampleData)