El nivel de anidamiento siempre se desconoce y los elementos secundarios pueden ser indefinidos o una matriz con al menos un elemento. Cada clave es siempre única. Este sería un ejemplo:
const arr = [{ key: '001', children: [{ key: 'abc', children: [{ key: 'ee', children: [{ key: 'goc', }, { key: 'zzv', children: [{ key: '241', }], }], }], }, { key: '125', children: undefined, }], }, { key: '003', children: [{ key: 'ahge', }, { key: '21521', }], }];Me gustaría escribir una función que reciba una clave para encontrar el elemento y luego actualice su campo secundario con la matriz secundaria dada y luego devuelva la matriz completa.
// Function that returns arr with updated the target element - how can I write this? const mysteryFn = (arr, key, childrenToUpdate) => { // Do something.. return arr; } const key = 'goc'; const childrenToUpdate = [{ key: '12345', }, { key: '25221a', }]; const newArr = mysteryFn(arr, key, childrenToUpdate); // expected newArr const newArr= [{ key: '001', children: [{ key: 'abc', children: [{ key: 'ee', children: [{ key: 'goc', children: [{ key: '12345', }, { key: '25221a', }], }, { key: 'zzv', children: [{ key: '241', }], }], }], }, { key: '125', children: undefined, }], }, { key: '003', children: [{ key: 'ahge', }, { key: '21521', }], }];Esto se puede lograr con la recursividad.
const mysteryFn = (arr, key, childrenToUpdate) => { // if children are undefined if (!arr) return; // loop over each entry and its children to find // entry with passed key arr.forEach((entry) => { if (entry.key === key) { entry.children = childrenToUpdate; } // recursive call to traverse children mysteryFn(entry.children, key, childrenToUpdate); }); return arr; };