Tengo un problema al reducir un objeto que contiene una matriz en una matriz simple. Tengo un backend que devuelve una lista de perros y su precio. La forma en que la API devuelve los datos parece realmente difícil de trabajar y estoy luchando para convertir el objeto en una matriz. He intentado convertirlo en una matriz y reducirlo.
Aquí hay un ejemplo: quiero convertir el siguiente objeto:
const a = { dogs: [{ "id": "dog1", "priceRange": [ "low", "high" ], "vaccinated": true, }, { "id": "dog2", "priceRange": [ "low", "high" ], "vaccinated": false, } ], "cost": [{ "id": "low", "cost": 200, }, { "id": "mid", "cost": 400, }, { "id": "high", "cost": 600, } ] };en esta matriz:
const reducedArray = [{ "id": "dog1", "priceRange": [{ "id": "low", "cost": 200, }, { "id": "high", "cost": 600, } ], "vaccinated": true, }, { "id": "dog2", "priceRange": [{ "id": "low", "cost": 200, }, { "id": "high", "cost": 600, } ], "vaccinated": false, } ]no estoy seguro
Primero debe iterar sobre su matriz a.dogs y dentro de cada iteración, también iterar sobre la matriz priceRange y encontrar su valor correspondiente dentro de la matriz a.cost y devolver eso en lugar de la cadena baja o alta.
a.dogs.map(dog => ({ ...dog, priceRange: dog.priceRange.map(priceRange => a.cost.find(cost => cost.id === priceRange)) }))Array#reduce , itere sobre a.cost mientras actualiza un Map donde la clave es la id y el valor es el objetoArray#map , itere sobre a.dogs y establezca los elementos priceRannge del Mapa usando otra iteración de Array#map const a = { "dogs": [ { "id": "dog1", "priceRange": [ "low", "high" ], "vaccinated": true }, { "id": "dog2", "priceRange": [ "low", "high" ], "vaccinated": false } ], "cost": [ { "id": "low", "cost": 200 }, { "id": "mid", "cost": 400 }, { "id": "high", "cost": 600 } ] }; const costMap = a.cost.reduce((map, cost) => map.set(cost.id, cost) , new Map); const reducedArray = a.dogs.map(dog => ({ ...dog, priceRange: dog.priceRange.map(range => { const { id, cost } = costMap.get(range) || {}; return { id, cost}; }) })); console.log(reducedArray);