Estoy buscando aplanar un objeto anidado en mi controlador (nuevo en Loopback y Typescript)
Aquí está mi modelo:
export class SampleModel { id: number; code: number; guide?: string; gradeData?: string; }Aquí hay un objeto de ejemplo:
{ "id": 1, "code": 12345, "guide": "Guide for 2021", "gradeData": { "en": "Eng grade", "de": "Ger grade" } }Aquí está mi controlador:
// returns an array of SampleModel objects @get('/guides') async find( @param.query.string('lang') lang: string, @param.filter(SampleModel) filter?: Filter<SampleModel> ): Promise<SampleModel[]> { return this.sampleModelRepository.find(filter); //this returns Promise<SampleModel[]> } Quiero modificar un poco esta respuesta en función de lang . Por ejemplo: si lang = en quiero que la respuesta se vea como
[ { "id": 1, "code": 12345, "guide": "Guide for 2021", "gradeData": "Eng grade" } ]¿Algo como esto? Por supuesto, debe hacer que el código de idioma sea dinámico.
[{ "id": 1, "code": 12345, "guide": "Guide for 2021", "gradeData": { "en": "Eng grade", "de": "Ger grade" } }].map(e=>{ e.gradeData = e.gradeData["en"]; return e; })Objeto devuelto:
[ { "id": 1, "code": 12345, "guide": "Guide for 2021", "gradeData": "Eng grade" } ]Gracias a @Firewizz pude hacer esto. Aquí está mi controlador actualizado:
// returns an array of SampleModel objects @get("/guides") async find( @param.query.string("lang") lang: string, @param.filter(SampleModel) filter?: Filter<SampleModel> ): Promise<SampleModel[]> { const res = this.sampleModelRepository.find(filter); //this returns Promise<SampleModel[]> if (lang != null) { (await res).map((e) => { if (e.gradeData != null && e.gradeData.hasOwnProperty(lang)) { e.gradeData = new Map(Object.entries(e.gradeData)).get(locale); // not sure why this is required but when I tried // `e.gradeData = e.gradeData[locale];` // I get compilation error " Element implicity has an 'any' type because index expression is not of type 'number' " maybe because gradeData is defined as a String but when I do // console.log(typeof e.gradeData) // I get object // I also tried // `e.gradeData = JSON.parse(e.gradeData)[locale];` // I get " SyntaxError: Unexpected token o in JSON at position 1 " and that could be because it's already an object // I then tried // `e.gradeData = JSON.parse(JSON.stringify(e.gradeData))[locale];` // this also works but I think converting this to a map as a workaround is better } return e; }); } return res; }