Tengo una matriz de datos, que tiene matrices anidadas dentro (level1arr, leve21arr ...)
const data = [ { level1arr: [ { level2arr: [{ id: 1, isValid: true }, { id: 2, isValid: true }, { id: 3, isValid: true }], }, { level2arr: [{ id: 4, isValid: true }, { id: 5, isValid: true }, { id: 6, isValid: true }], }, ], }, { level1arr: [ { level2arr: [{ id: 7, isValid: true }, { id: 8, isValid: true }, { id: 9, isValid: true }], }, { level2arr: [{ id: 10, isValid: true }, { id: 11, isValid: true }, { id: 12, isValid: true }], }, ], }, ];También tengo otra matriz:
const invalidIds = [2,5]Quiero encontrar elementos con una identificación apecyfic y cambiar la propiedad isValid a false. ¿Es mejor que iterar sobre múltiples matrices anidadas, así:
data.forEach(lvl1 => { lvl1.level1arr.forEach(lvl2 => { lvl2.level2arr.forEach(element => { // further nesting }); }); })Esta iteración sobre varias matrices no es buena para el rendimiento. ¿Cuál es la mejor manera de manejar este caso con matrices anidadas?
Si se tratara de matrices anidadas, podría usar Array.prototype.flat() . Sin embargo, tiene una combinación de matrices y objetos anidados. Tendrá que escribir un "aplanador" personalizado para esta estructura de datos. Verifique esta respuesta para obtener más detalles: ¿cómo convertir este objeto anidado en un objeto plano?
Puede usar la recursividad hasta que alcance el nivel que necesita. Esta es una forma de hacerlo.
const data = [{ level1arr: [{ level2arr: [{ id: 1, isValid: true }, { id: 2, isValid: true }, { id: 3, isValid: true }], }, { level2arr: [{ id: 4, isValid: true }, { id: 5, isValid: true }, { id: 6, isValid: true }], }, ], }, { level1arr: [{ level2arr: [{ id: 7, isValid: true }, { id: 8, isValid: true }, { id: 9, isValid: true }], }, { level2arr: [{ id: 10, isValid: true }, { id: 11, isValid: true }, { id: 12, isValid: true }], }, ], }, ]; const invalidIds =[2,5] const findId = (object, key, value) => { if (Array.isArray(object)) { for (const obj of object) { findId(obj, key, value); } } else { if (object.hasOwnProperty(key) && object[key] === value) { object.isValid = false; return object } for (const k of Object.keys(object)) { if (typeof object[k] === "object") { findId(object[k], key, value); } } } } invalidIds.forEach(id => findId(data, "id", id)) console.log(data)