Necesito realizar un filtro en la matriz de objetos para obtener todas las claves. Aunque, siempre que haya un obj dentro de esa clave, necesitaría obtener el nombre de la clave y concatenar con el nombre de la clave del obj, por ejemplo:
const data = [ id: 5, name: "Something", obj: { lower: True, higher: False } ] result = ["id", "name", "obj.lower", "obj.higher"] Podría lograr hacer el código anterior, pero, si hay más objs dentro de los datos, tendría que seguir agregando una condición if dentro de mi lógica, me gustaría saber si hay alguna otra forma, así que no No importa cuántos objetos tenga dentro de los objetos, siempre se concatará.
El código que utilicé de la mención anterior:
const itemsArray = [ { id: 1, item: "Item 001", obj: { name: 'Nilton001', message: "Free001", obj2: { test: "test001" } } }, { id: 2, item: "Item 002", obj: { name: 'Nilton002', message: "Free002", obj2: { test: "test002" } } }, { id: 3, item: "Item 003", obj: { name: 'Nilton003', message: "Free003", obj2: { test: "test003" } } }, ]; const csvData = [ Object.keys(itemsArray[0]), ...itemsArray.map(item => Object.values(item)) ].map(e => e.join(",")).join("\n") // Separating keys let keys = [] const allKeys = Object.entries(itemsArray[0]); for (const data of allKeys) { if (typeof data[1] === "object") { const gettingObjKeys = Object.keys(data[1]); const concatingKeys = gettingObjKeys.map((key) => data[0] + "." + key); keys.push(concatingKeys); } else { keys.push(data[0]) } } //Flating const flattingKeys = keys.reduce((acc, val: any) => acc.concat(val), []);Lo que me gustaría lograr, supongamos que tengo esta matriz de objetos:
const data = [ { id: 10, obj: {name: "Name1", obj2: {name2: "Name2", test: "Test"}}} ... ] Final result = ["id", "obj.name", "obj.obj2.name2", "obj.obj2.test"] OBS: The first obj contains all the keys I need, no need to loop through other to get KEYS.Me gustaría lograr todas las claves del primer objeto de la matriz, y si hay objetos dentro de los objetos, me gustaría concatenar los nombres de obj (obj.obj2key1)
Puede asignar la clave o las claves de los objetos anidados.
const getKeys = object => Object .entries(object) .flatMap(([k, v]) => v && typeof v === 'object' ? getKeys(v).map(s => `${k}.${s}`) : k ), getValues = object => Object .entries(object) .flatMap(([k, v]) => v && typeof v === 'object' ? getValues(v) : v ), data = { id: 1, item: "Item 001", obj: { name: 'Nilton001', message: "Free001", obj2: { test: "test001" } } }, keys = getKeys(data), values = getValues(data); console.log(keys); console.log(values); .as-console-wrapper { max-height: 100% !important; top: 0; }algo como esto
const itemsArray = [ { id: 1, item: "Item 001", obj: { name: 'Nilton001', message: "Free001", obj2: { test: "test001" } } }, { id: 2, item: "Item 002", obj: { name: 'Nilton002', message: "Free002", obj2: { test: "test002" } } }, { id: 3, item: "Item 003", obj: { name: 'Nilton003', message: "Free003", obj2: { test: "test003" } } }, ]; const item = itemsArray[0]; const getAllKeys = (obj, prefix=[]) => { if(typeof obj !== 'object'){ return prefix.join('.') } return Object.entries(obj).flatMap(([k, v]) => getAllKeys(v, [...prefix, k])) } console.log(getAllKeys(item))Puede usar la recursividad de la siguiente manera. Como typeof([1,3,5]) es object , también tenemos que confirmar que value no es una matriz, !Array.isArray(value) :
const obj = { id: 10, obj: {name: "Name1", obj2: {name2: "Name2", test: "Test"}}}; const getKeys = (o,p) => Object.entries(o).flatMap(([key,value]) => typeof(value) === 'object' && !Array.isArray(value) ? getKeys(value, (p?`${p}.`:"") + key) : (p ? `${p}.`: "") + key ); console.log( getKeys(obj) );