Quería obtener el precio total del productPrice
de la matriz de chosenData
. Necesito compararlo desde mainData
y solo obtener su valor total. Mi problema es que me estoy volviendo indefinido y ¿cómo debo hacerlo y hay una forma más corta de hacerlo?
const mainData = [ { "id": "4324", "productName": "Apple", "productPrice": 250, }, { "id": "656546b", "productName": "Banana", "productPrice": 500, }, { "id": "5656", "productName": "Soup", "productPrice": 800, } ]; const chosenData = ['5656', '656546b'] const newArray = chosenData.map((value, index) => ({ productPrice: mainData.find((data) => data.id === value) })) console.log(newArray.productPrice)
En su solución, newArray obtenido a través del mapa es una matriz, y la matriz no tiene el atributo productPrice
, por lo tanto, no está definido.
Puede filtrar el objeto con una identificación coincidente y luego resumirlos, por ejemplo:
mainData.filter(value=>chosenData.includes(value.id)).reduce((acc, cur)=>acc+cur.productPrice, 0)
map
devuelve una nueva matriz y no omite ningún elemento. Puede usar reduce
y dentro de la devolución de llamada reduce, use find
. Si se encuentra un elemento con la misma identificación en maindData, devolverá el objeto sin definir. Si no está indefinido, obtenga el valor y acumule.
const mainData = [{ "id": "4324", "productName": "Apple", "productPrice": 250, }, { "id": "656546b", "productName": "Banana", "productPrice": 500, }, { "id": "5656", "productName": "Soup", "productPrice": 800, } ]; const chosenData = ['5656', '656546b'] const newArray = chosenData.reduce((acc, curr) => { const findById = mainData.find(item => item.id === curr); findById && (acc += findById.productPrice) return acc; }, 0) console.log(newArray)
Su newArray
es una matriz. No puede acceder a su propiedad como newArray.productPrice
. Desea calcular un valor de su newArray, por lo que puede usar reduce()
. Desarrollando su código
const mainData = [ { "id": "4324", "productName": "Apple", "productPrice": 250, }, { "id": "656546b", "productName": "Banana", "productPrice": 500, }, { "id": "5656", "productName": "Soup", "productPrice": 800, } ]; const chosenData = ['5656', '656546b'] const newSum = chosenData.map((value, index) => ({ productPrice: mainData.find((data) => data.id === value) })).reduce((agg,x) => { return agg + x.productPrice.productPrice },0); console.log(newSum)
Si no quieres complicarte con demasiadas propiedades puedes usar este código:
const mainData = [ { "id": "4324", "productName": "Apple", "productPrice": 250, }, { "id": "656546b", "productName": "Banana", "productPrice": 500, }, { "id": "5656", "productName": "Soup", "productPrice": 800, } ]; const chosenData = ['5656', '656546b'] const newSum = chosenData.map((value, index) => mainData.find((data) => data.id === value).productPrice).reduce((agg,x) => agg + x,0); console.log(newSum)