Tengo un objeto anidado. Necesito una función. Necesito usarlo para encontrar la "clave principal". ¿Qué función debo usar para ello? Mis datos :
[{ "Name": "Main Menu", "Key": "1", "Children": [{ "Name": "Sub Menu 1", "Key": "10", "Children": [{ "Name": "Very Sub Menu", "Key": "20", "Children": [] }] }] }, { "Name": "Main Menu 2", "Key": "2", "Children": [{ "Name": "Sub Menu 2", "Key": "11", "Children": [{ "Name": "Very Sub Menu 2", "Key": "21", "Children": [{ "Name": "Extra Small Menu", "Key": "30", "Children": [] }] }] }] } ]Por ejemplo, cuando envío mi matriz y clave (por ejemplo, "10" (Submenú 1) para ese ejemplo), necesito tomar 1 como resultado (Tecla de menú principal).
Ejemplo 2: Si doy 30 como clave; Necesito tomar 21 como resultado. Cómo puedo hacerlo ? ¡Gracias por las respuestas!
Intenté como:
var res = myData.filter(function f(o) { if (o.key === dragKey) return true; if (o.children) { return (o.children = o.children.filter(f)).length; } }); console.log(res); // Its giving main whole data main level to child level. I need just 1 upper level data.Podrías usar la recursividad para esto. Bucle a través del objeto con
const findObjectByKey = (parent, object, key) => { // make object optional because the first iteration is null if (object?.key === key) return parent for (const obj of Object.entries(object.children)) { return findObjectByKey(object, obj, key) } } const finalparent = findObjectByKey(null, object, 30)NOTA: Este es un pseudocódigo no probado solo para darle una idea de cómo lo resolvería.
Debe escribir una función recursiva que tome una matriz como entrada. Recorra los elementos de la matriz y verifique si la clave coincide, si lo hace, devuelve un resultado que declara que ha encontrado al niño. Luego, en el padre, devuelva la identificación del padre en cada llamada para que tenga la identificación del padre al final. De lo contrario, llama a la función misma con los hijos del nivel actual. Espero que entiendas la idea detrás de esto. Si no sabe cómo funcionan las funciones recursivas, simplemente búsquelo en Google y apréndalo.
Lo que haría es usar la recursividad para revisar cada objeto anidado y verificar si hay some niños con la clave que está buscando.
function getParentKey(arr, key, index = 0) { if (!Array.isArray(arr[index].Children)) return; if (arr[index].Children.some(child => child.Key === key)) return arr[index].Key; return getParentKey(arr[index], key, index + 1); } console.log(getParentKey(mydata, "10")); const mydata = [{ "Name": "Main Menu", "Key": "1", "Children": [{ "Name": "Sub Menu 1", "Key": "10", "Children": [{ "Name": "Very Sub Menu", "Key": "20", "Children": [] }] }] }, { "Name": "Main Menu 2", "Key": "2", "Children": [{ "Name": "Sub Menu 2", "Key": "11", "Children": [{ "Name": "Very Sub Menu 2", "Key": "21", "Children": [{ "Name": "Extra Small Menu", "Key": "30", "Children": [] }] }] }] }] function getParentKey(arr, key, index = 0) { if (!Array.isArray(arr[index].Children)) return; if (arr[index].Children.some(child => child.Key === key)) return arr[index].Key; return getParentKey(arr[index], key, index + 1); } console.log(getParentKey(mydata, "10"));