Tengo un objeto con este aspecto
const item = { id: 123, type: 'book', sections: [{ type: 'section', id: '456', index: 1, lessons: [{ type: 'lesson', id: 789, index: 1 }, { type: 'lesson', id: 999, index: 2 } ] }, { type: 'section', index: 2, id: 321, lessons: [{ type: 'lesson', id: 444, index: 1 }, { type: 'lesson', id: 555, index: 2 } ] }] }
Se debe suponer que hay más objetos en la matriz de secciones y lecciones. Quiero crear un nuevo objeto como este.
result = [{ section: 456, lessons: [789, 999] }, { section: 321, lessons: [444, 555] }]
Probé este ciclo, pero esto solo empuja los índices y no las identificaciones de la lección
let obj = {}; let sectionWithLessons = []; let lessons = [] for (const i in item.sections) { obj = { sectionId: item.sections[i].id, lessonIds: item.sections[i].lessons.map((lesson) => { return lessons.push(lesson.id) }), }; sectionWithLessons.push(obj); } console.log(sectionWithLessons);
¿Cómo puedo hacer esto correctamente y preferiblemente teniendo en cuenta un buen rendimiento?
Creo que lo mejor/más corto es usar la función de mapa, como:
const result2 = item.sections.map(({id, lessons}) => ({ id, lessons: lessons.map(({id: lessionId}) => lessionId) }))
Sugeriría usar Array.map()
para convertir las secciones de elementos al resultado deseado.
Convertiríamos cada sección en un objeto con un valor de section
y una matriz de lessons
.
Para crear la matriz de lecciones, nuevamente usamos Array.map() para asignar cada lección a una identificación de lección.
const item = { id: 123, type: 'book', sections: [{ type: 'section', id: '456', index: 1, lessons: [{ type: 'lesson', id: 789, index: 1 }, { type: 'lesson', id: 999, index: 2 } ] }, { type: 'section', index: 2, id: 321, lessons: [{ type: 'lesson', id: 444, index: 1 }, { type: 'lesson', id: 555, index: 2 } ] }] } const result = item.sections.map(({ id, lessons }) => { return ({ section: +id, lessons: lessons.map(({ id }) => id) }) }); console.log('Result:', result);
.as-console-wrapper { max-height: 100% !important; }