Cuando accedo a una API de registro público, recibo más información de la que necesito y, a veces, los datos se devuelven con variaciones menores. Me gustaría eliminar algunos campos innecesarios, mover los campos anidados al nivel superior y cambiarles el nombre. El objetivo es estandarizar el formato en varias API diferentes y mantener el requisito de memoria al mínimo. Ejemplo a continuación:
Objeto crudo:
[ { startDate: "2022/08/27", expiryDate: "2025/08/27", party: { type: "Business", name: "Irregular Expressions Inc." }, location: { type: "Office", address: { locality: "Boston", postcode: "PE21 8QR" } } }, { startDate: "2023/12/22", expiryDate: "2024/06/22", party: { type: "Charity", name: "Save the Badgers" }, site: { type: "Office", address: { locality: "Badgerton", postcode: "BA6 6ER" } } }, ]Quiero transformar esto en una matriz más pequeña y limpia:
[ { startDate: "2022/08/27", expiryDate: "2025/08/27", partyName: "Irregular Expressions Inc.", location: "Boston" }, { startDate: "2023/12/22", expiryDate: "2024/06/22", partyName: "Save the Badgers", location: "Badgerton" }, ]He intentado lo siguiente, pero recibo un error.
module.exports = { testTransform: (inputArray) => { const outputArray = [] inputArray.forEach(element => { outputArray.push({ startDate: element.startDate, expiryDate: element.expiryDate, partyName: element.party.name, location: element.location.address.locality }) }) return JSON.stringify(outputArray, null, ' ') } } TypeError: Cannot read properties of undefined (reading 'address')¿Voy en la dirección correcta o hay una forma más sencilla de hacerlo? He buscado este tipo de transformación pero sin suerte. ¿Qué me estoy perdiendo?
Puede tomar la location o el site con OR lógico || y luego las propiedades con operador de encadenamiento opcional ?. .
const data = [{ startDate: "2022/08/27", expiryDate: "2025/08/27", party: { type: "Business", name: "Irregular Expressions Inc." }, location: { type: "Office", address: { locality: "Boston", postcode: "PE21 8QR" } } }, { startDate: "2023/12/22", expiryDate: "2024/06/22", party: { type: "Charity", name: "Save the Badgers" }, site: { type: "Office", address: { locality: "Badgerton", postcode: "BA6 6ER" } } }], result = data.map(o => ({ startDate: o.startDate, expiryDate: o.expiryDate, partyName: o.party.name, location: (o.location || o.site)?.address?.locality })); console.log(result);Está intentando leer la propiedad de locality de undefined . Puede usar el operador de encadenamiento opcional para evitar el lanzamiento de la excepción. Por lo tanto, debe usar algo como element?.location?.address?.locality en lugar de element.location.address.locality .
Dado que parece que no sabe cuál será la clave externa para el objeto con la propiedad de address , si el objeto siempre tendrá 4 propiedades, al desestructurar, puede usar la sintaxis de descanso para recopilar la propiedad final en un solo objeto, y luego tome los valores de ese objeto para llegar a la dirección.
const input=[{startDate:"2022/08/27",expiryDate:"2025/08/27",party:{type:"Business",name:"Irregular Expressions Inc."},location:{type:"Office",address:{locality:"Boston",postcode:"PE21 8QR"}}},{startDate:"2023/12/22",expiryDate:"2024/06/22",party:{type:"Charity",name:"Save the Badgers"},site:{type:"Office",address:{locality:"Badgerton",postcode:"BA6 6ER"}}}]; const output = input.map(({ startDate, expiryDate, party, ...rest }) => ({ startDate, expiryDate, partyName: party.name, location: Object.values(rest)[0].address.locality, })); console.log(output);