Estoy llamando a una API donde la respuesta reduce la repetición con una estructura de datos relacional donde un conjunto de datos se refiere a un segundo conjunto. Aquí hay un ejemplo de la estructura:
{ products: [ { name: 'Wine', restrictions: ['age'], }, { name: 'Pain killers', restrictions: ['bulk-limit'], }, { name: 'Chocolate', restrictions: [], }, ], restrictions: [ { type: 'age', minAge: 18, }, { type: 'bulk-limit', maxQuantity: 2, }, ], }
El consumidor necesita unir estos datos usando los products
que contienen una matriz de restrictions
de string
que se relacionan con los datos en la matriz de restrictions
. Mi primera pregunta es, ¿esta estructura de datos tiene un nombre común?
En segundo lugar, he escrito una función para unir los datos en una sola matriz de productos:
function mapRestrictionsToProducts(response: ProductsResponse): Product[] { let restrictionMap = new Map<string, Restriction>(); response.restrictions.forEach((restriction) => { switch (restriction.type) { case 'age': return restrictionMap.set('age', { type: 'age', minAge: restriction.minAge, }); case 'bulk-limit': return restrictionMap.set('bulk-limit', { type: 'BULK_BUY_LIMIT', maxQuantity: restriction.maxQuantity, }); default: console.warn('Unknown restriction', restriction); return; } }); return response.products.map(p => { let product: Product = { name: p.name, restrictions: p.restrictions.reduce<Restriction[]>( (prev, curr) => { let mappedRestriction = restrictionMap.get(curr); if (mappedRestriction) { prev.push(mappedRestriction); } return prev; }, [] ), }; return product; }); }
Aunque esta función hace lo que se necesita, contiene dos mapas de matriz, uno de los cuales contiene una reducción, y se siente demasiado complejo. ¿Hay mejores opciones con las que iterar sobre estos datos y producir el mismo resultado?