Dada una matriz como esta, donde la profundidad máxima puede ser de 3 niveles y donde no sabemos en qué nivel podría estar el elemento investigado:
const data = { id: '1', children: [ { id: '2', name: 'nameTest', children: [ { id: '3' name: 'deepLevel' } ] } }¿Cómo puedo agregar una propiedad al tercer nivel sabiendo solo el valor 'deepLevel'? se nos permite usar lodash y se nos recomienda encarecidamente que usemos ES6.
la estructura de datos final debe ser
Dada una matriz como esta, donde la profundidad máxima puede ser de 3 niveles:
const data = { id: '1', children: [ { id: '2', name: 'nameTest', children: [ { id: '3' name: 'deepLevel' addedProperty: true, } ] } }Un enfoque consistía en separar las tareas de encontrar un elemento anidado mediante una entrada personalizable (par clave-valor) y asignar datos personalizados adicionales al elemento encontrado.
Por lo tanto, uno, por ejemplo, podría implementar dos métodos de forma recursivelyFindItemByEntry FindItemByEntry, que se basa en la autorrecurrencia y una simple asignación a assignToObjectWithFirstMatchingNestedEntry que asigna los datos proporcionados al resultado de la invocación de la función anterior ...
function recursivelyFindItemByEntry(obj, [key, value]) { let item; if (!!obj && (typeof obj === 'object')) { if ( obj.hasOwnProperty(key) && (obj[key] === value) ) { item = obj; } else if ( obj.hasOwnProperty('children') && Array.isArray(obj.children) ) { obj.children.some(child => { item = recursivelyFindItemByEntry(child, [key, value]); return !!item; }); } } return item; } function assignToObjectWithFirstMatchingNestedEntry(obj, [key, value], data) { Object.assign( recursivelyFindItemByEntry(obj, [key, value]) ?? {}, data ?? {} ); return obj; } const data = { id: '1', children: [{ id: '2', name: 'nameTest', children: [{ id: '3', name: 'deepLevel', }, { id: '4', name: 'deepLevel', }], }, { id: '5', name: 'nameTest', children: [{ id: '6', name: 'deepLevel', }, { id: '7', name: 'deepLevelTarget', // addedProperty: true, }, { id: '8', name: 'deepLevel', }], }, { id: '9', name: 'nameTest' }, { id: '10', name: 'nameTestTarget' }, { id: '11', name: 'nameTest' }], }; console.log( "recursivelyFindItemByEntry(data, ['name', 'deepLevelTarget']) ...", recursivelyFindItemByEntry(data, ['name', 'deepLevelTarget']) ); console.log( "recursivelyFindItemByEntry(data, ['id', '10']) ...", recursivelyFindItemByEntry(data, ['id', '10']) ); console.log('\n'); console.log( "recursivelyFindItemByEntry(data, ['id', 'foo']) ...", recursivelyFindItemByEntry(data, ['id', 'foo']) ); console.log( "recursivelyFindItemByEntry(data, ['id', '1']) ...", recursivelyFindItemByEntry(data, ['id', '1']) ); console.log('\n'); console.log( "assignToObjectWithFirstMatchingNestedEntry(data, ['name', 'deepLevelTarget']), { addedProperty: true } ...", assignToObjectWithFirstMatchingNestedEntry(data, ['name', 'deepLevelTarget'], { addedProperty: true }) ); .as-console-wrapper { min-height: 100%!important; top: 0; }