Tengo un objeto que se parece a lo siguiente:
const testObject = { "NameA": { "Name": { "_text": "Peter" } }, "AgeA": { "_comment": "line=2", "age": { "_text": "21" } }, "Birth": { "_comment": "line=3", "Birthday": { "DateTimeSignUTCOffset": { "Date": { "_text": "191201" }, "Time": { "_text": "1123" }, }, "Test": { "Code": { "_text": "1234" } }, } } } Estoy tratando de encontrar cualquier clave con la clave _text y obtener el valor correspondiente y la clave principal.
es decir
const result = { "Name": "Peter", "age": "21", "Date": "191201", "Time": "1123", "Code": "1234" };Intenté lo siguiente recorriendo el objeto, pero no puedo resolverlo.
const result = {}; const find_items = (object) => { console.log(Object.keys(object)); Object.keys(object).map((item) => { console.log(object[item]); if(object[item] !== '_text') { find_items(object[item]) } else { console.log(item) } }); }; find_items(testObject); console.log(result);¿Alguien podría indicarme la dirección correcta?
Puede adoptar un enfoque recursivo y verificar el objeto y, si existe la propiedad _text , tomar el valor con la clave externa u obtener las entradas de la llamada recursiva con el objeto.
Al final, construya un objeto a partir de todas las entradas.
const flatEntries = object => Object .entries(object) .flatMap(([k, v]) => { if (v && typeof v === 'object') return '_text' in v ? [[k, v._text]] : flatEntries(v); return []; }); testObject = { NameA: { Name: { _text: "Peter" } }, AgeA: { _comment: "line=2", age: { _text: "21" } }, Birth: { _comment: "line=3", Birthday: { DateTimeSignUTCOffset: { Date: { _text: "191201" }, Time: { _text: "1123" } }, Test: { Code: { _text: "1234" } } } } }, result = Object.fromEntries(flatEntries(testObject)); console.log(result);en ingles lo que quieres hacer es:
cree un objeto vacío llamado "resultado" y luego itere recursivamente a través del objeto "objeto". cada vez que encuentre una clave vinculada a un subobjeto que tiene un campo de texto __, agréguelo al objeto "resultado".
ahora solo traduzca lo anterior a JavaScript.
la palabra clave aquí es "recursivamente". su código original no era recursivo.
su idea es bastante buena, pero desea encontrar claves _text en cualquier lugar anidado dentro del objeto. Para encontrar claves internas anidadas, debe repetir su función si el valor de alguna clave resulta ser un objeto.
result = {} find_text_keys = (haystack, label) => { Object.keys(ob).forEach(key => { if (key === '_text') { res[text] = ob["_text"]; } else if (typeof(ob[key]) === "object") { find_text_keys(ob[key], key); } }); } Luego, llamar a la función con una etiqueta predeterminada f(object, "default_label") llenará el diccionario de result como desee.