Necesito encontrar si el elemento existe en una matriz anidada profunda.
Ejemplo :
let arr = [ { id: 1 , title : 'Test' , children: [ {id: 1 , title: 'Title' , hasChild : true }, {id: 1 , title: 'Title' , hasChild : false }, {id: 1 , title: 'Title' }, ] }, ] Necesito repetir el pensamiento arr.children y tratar de encontrar si tiene una propiedad con el nombre hasChild find item y establecerlo en falso.
Después de hacer un bucle, necesito obtener una matriz como :
let arr = [ { id: 1 , title : 'Test' , children: [ {id: 1 , title: 'Title' , hasChild : false }, //here is changed hasChild to false {id: 1 , title: 'Title' , hasChild : false }, {id: 1 , title: 'Title' }, ] }, ]Estoy encontrando la manera pero necesito una mejor solución:
arr.map(it) => { if (it.hasChild) { it.dashCheck = false; } });demostración:
let arr = [{ id: 1 , title : 'Test' , children: [ {id: 1 , title: 'Title' , hasChild : true }, {id: 1 , title: 'Title' , hasChild : false }, {id: 1 , title: 'Title' }, ] }]; arr.forEach((obj) => { obj.children.forEach((childObj) => { if (childObj.hasChild) { childObj.hasChild = false; } }); }); console.log(arr);Puede usar funciones recursivas para realizar operaciones en objetos/matrices infinitamente anidados, etc.
function recursiveUpdate(array, index) { const element = array[index]; if(!element) return; if(Object.keys(element).indexOf('children') > -1) { element.hasChild = true; recursiveUpdate(element['children'], 0); } else { element.hasChild = false; recursiveUpdate(array, index+1); } } recursiveUpdate(arr, 0);Editar : parece que la pregunta se modificó después de dar mi respuesta. Actualicé mi respuesta para reflejar esto.
Si la estructura de arr siempre es como la que mencionaste en tu pregunta, podrías simplemente iterar sobre children elementos secundarios usando el método forEach de la clase Array :
arr.forEach(item => { item.children.forEach(child => { // Edit: Revised solution if (child.hasChild === true) { child.hasChild = false; } // Edit: Previous solution // child.hasChild = child.hasChild === true ? false : child.hasChild; }); }); Nota : Esto alterará la matriz original y no creará una copia con el valor alterado para hasChild .