¿Cuál es la mejor manera de asignar todas las propiedades del objeto a un nuevo formato de objeto con diferentes nombres de propiedad? Ejemplo:
este es el formato deseado
const person = { firstName: 'john', lastName: 'doe', houses: [{ housName: 'Kruger' }] }y tengo estos dos objetos
const person1 = { prenom: 'john', //this should be mapped to the firstName nom: 'doe', //this should be mapped to the lastName houses: [{ house_name: 'Kruger' }] } const person2 = { name: 'john', // this should be mapped to the firstName familyName: 'doe', // this should be assigned to the lastName Houses: [{ House_Name: 'Kruger' }] };El objetivo es hacer que person1 y person2 con todas sus propiedades y subpropiedades parezcan person.
YO HE TRATADO
export class Person { @Expose({ name: 'prenom' }) firstName: string; @Expose({ name: 'nom' }) lastName: string; } } //this should give a formatted version from person1 ==> person const formatted = plainToClass(person1,Person)Sin embargo, esto me obligaría a crear múltiples iteraciones de la clase Person, lo cual no es conveniente si queremos usar esta clase para escribir.
Primero, debe obtener todas las claves y valores de object mediante Object.entries(obj) , luego, en cada clave, debemos convertirla de pascal case a camel case , primero debemos cambiar la cadena a lower case luego con replace /_([az])/gi que capturan la primera letra después del guión bajo _ y la convierten en Upper case .
str.toLowerCase().replace(/_([az])/gi, function (g) { return g[1].toUpperCase(); });Luego, reduzca la matriz y conviértala de nuevo en un objeto.
const mapToCamelCase = (obj) => { return Object.entries(obj).reduce((acc, [key,value]) => { var keyCamelCased = toCamelCase(key) acc[keyCamelCased] = value return acc }, {}) } const person1 = { first_name: 'john', last_name: 'doe', houses: [{ house_name: 'Kruger' }] } const person2 = { First_Name: 'john', Last_Name: 'doe', Houses: [{ House_Name: 'Kruger' }] }; const toCamelCase = (str) => { return str.toLowerCase().replace(/_([az])/gi, function (g) { return g[1].toUpperCase(); }); } const mapToCamelCase = (obj) => { return Object.entries(obj).reduce((acc, [key,value]) => { var keyCamelCased = toCamelCase(key) acc[keyCamelCased] = value return acc }, {}) } console.log(mapToCamelCase(person1)) console.log(mapToCamelCase(person2))Una función recursiva simple puede hacer la conversión de nombre que desee. Esto funcionará para entradas con cualquier profundidad de entradas.
Uso de Object.entries() y Object.fromEntries()
const person1 = { first_name: "john", last_name: "doe", houses: [{ house_name: "Kruger" }], }; const person2 = { First_Name: "john", Last_Name: "doe", Houses: [{ House_Name: "Kruger" }], }; const person3 = { first_name: "john", last_name: "doe", houses: [ { house_name: "Kruger", phone_numbers: [{ ext_code: "+54", phone_number: 232242323 }], }, ], }; const formatName = (str) => { return str .split("_") .map( (w, index) => (index > 0 ? w[0].toUpperCase() : w[0].toLowerCase()) + w.substring(1) ) .join(""); }; const formatNames = (input) => { if (Array.isArray(input)) { return input.map((item) => formatNames(item)); } else if (typeof input === "object") { return Object.fromEntries( Object.entries(input).map(([key, value]) => [ formatName(key), formatNames(value), ]) ); } return input; }; console.log(formatNames(person1)); console.log(formatNames(person2)); console.log(formatNames(person3)); Nota: si convirtió la función formatName en un argumento para formatNames , formatNames es mucho más flexible, ya que se puede usar para formar objetos con formato de nombre diferente.
Mi solución será crear un archivo de clase como este
en persona.js
class Person { constructor(personObj) { this.firstName = personObj.first_name, this.lastName = personObj.Last_Name, this.houses = personObj.Houses; } } const person1 = { first_name: 'john', last_name: 'doe', houses: [{ house_name: 'Kruger' }] } const formatted = new Person(person1)