Necesito convertir objeto:
{ middleName: null, name: "Test Name", university: { country: { code: "PL" }, isGraduated: true, speciality: "Computer Science" } }a la matriz:
[{ key: "name", propertyValue: "Test Name", }, { key: "middleName", propertyValue: null, }, { key: "university.isGraduated", propertyValue: true, }, { key: "university.speciality", propertyValue: "Computer Science", }, { key: "university.country.code", propertyValue: "PL" }];Escribí un algoritmo, pero es bastante tonto, ¿cómo puedo mejorarlo? Importante, si el objeto tiene un objeto anidado, entonces necesito escribir el objeto anidado a través de un punto (por ejemplo, universidad.país: "valor")
let arr = []; Object.keys(parsedObj).map((key) => { if (parsedObj[key] instanceof Object) { Object.keys(parsedObj[key]).map((keyNested) => { if (parsedObj[key][keyNested] instanceof Object) { Object.keys(parsedObj[key][keyNested]).map((keyNestedNested) => { arr.push({ 'key': key + '.' + keyNested + '.' + keyNestedNested, 'propertyValue': parsedObj[key][keyNested][keyNestedNested] }) }) } else { arr.push({ 'key': key + '.' + keyNested, 'propertyValue': parsedObj[key][keyNested] }) } }) } else { arr.push({ 'key': key, 'propertyValue': parsedObj[key] }) } });Gracias
Implementación de una función recursiva.
He considerado que su objeto consiste solo en una cadena y un objeto como valores. Si tiene más tipos de tipos de datos como sus valores, es posible que tenga que desarrollar esta función.
const myObj = { middleName: null, name: "Test Name", university: { country: { code: "PL" }, isGraduated: true, speciality: "Computer Science" } } const myArr = []; function convertObjectToArray(obj, keyPrepender) { Object.entries(obj).forEach(([key, propertyValue]) => { if (typeof propertyValue === "object" && propertyValue) { const updatedKey = keyPrepender ? `${keyPrepender}.${key}` : key; convertObjectToArray(propertyValue, updatedKey) } else { myArr.push({ key: keyPrepender ? `${keyPrepender}.${key}` : key, propertyValue }) } }) } convertObjectToArray(myObj); console.log(myArr);Escribí una versión pequeña usando la función recursiva y otra para la validación es un objeto.
let values = { middleName: null, name: "Test Name", university: { country: { code: "PL" }, isGraduated: true, speciality: "Computer Science" } } function isObject(obj) { return obj != null && obj.constructor.name === "Object" } function getValues(values) { let arrValues = Object.keys(values).map( v => { return { key: v, value: isObject(values[v]) ? getValues(values[v]) : values[v] }; }); console.log(arrValues); } getValues(values);Esto es lo más a prueba de balas que pude hacer: D, sin necesidad de una variable global, ¡solo lo tomas y lo usas donde quieras!
const test = { middleName: null, name: "Test Name", university: { country: { code: "PL" }, isGraduated: true, speciality: "Computer Science" } }; function toPropertiesByPath(inputObj) { let arr = []; let initialObj = {}; const getKeys = (obj, parentK='') => { initialObj = arr.length === 0 ? obj: initialObj; const entries = Object.entries(obj); for(let i=0; i<entries.length; i++) { const key = entries[i][0]; const val = entries[i][1]; const isRootElement = initialObj.hasOwnProperty(key); parentK = isRootElement ? key: parentK+'.'+key; if(typeof val === 'object' && val!==null && !Array.isArray(val)){ getKeys(val, parentK); } else { arr.push({ key: parentK, property: val }); } } }; getKeys(inputObj); return arr; } console.log(toPropertiesByPath(test));