Tengo dos API diferentes que obtuve usando await Promise.all() . Se asignan a una variable llamada items . La response de la API #1 es un objeto que se vería así:
{ total: 3, items: [ {…}, {…}, {…} ] } La response de la API #2 es solo una matriz de objetos.
Ahora quiero terminar con un objeto que se parece a la response de la API n.º 1, usando un reductor para agregar la longitud de las API n.º 2 al total y 'combinar' la response de la API n.º 2 en la matriz de items .
Esto es lo que he ido para:
const items = results.reduce((accumulator, { response }) => { const total = response?.total ?? response?.length if(!accumulator?.items) { accumulator.items = [] } accumulator.items = [ ...accumulator.items, ...(response?.items ?? response) ] return ({ ...accumulator, total: (accumulator?.total ?? 0) + total }) }, {})Mi intuición es que definitivamente podría haber una forma más limpia/estructurada de lograr el mismo resultado. ¿Algún contratiempo importante que deba reconsiderar?
Parece exagerado incluso mirar cualquier total . Tiene las matrices individuales y por longitudes de consecuencia.
Propondría usar flatMap para concatenar todas las matrices y solo crear una propiedad total al final:
const results = [ { response: { total: 3, items: [1, 2, 3] } }, { response: [4, 5, 6, 7] } ]; const items = (items => ({ items, total: items.length })) (results.flatMap(({response}) => response.items ?? response)); console.log(items); Personalmente, no crearía la propiedad total en absoluto. items.length hace todo lo que necesita.