Me gustaría disculparme de antemano si ya hay una pregunta como esta, pero he estado buscando todo el día y realmente puedo encontrar cualquier cosa.
Llamo a una API que devuelve una respuesta. Luego solo obtengo los detalles/datos que necesito y actualmente tengo un archivo json con este valor de muestra:
{ "total": 563, "shipping_fee": 58, "e_charges": ???, "order_items": [ { "item_id": 6291020872, "quantity": 1, "price": 88, "total": 88 }, { "item_id": 7755274567, "quantity": 1, "price": 150, "total": 150 }, { "item_id": 7980571205, "quantity": 1, "price": 45, "total": 45 }, { "item_id": 12612977930, "quantity": 1, "price": 280, "total": 280 } ] }, ... {} {} {}.... Mi problema es que necesito obtener la suma de todo el total en order_items [] luego, luego de eso, necesito agregar shipping_fee y obtener 2 conjuntos de porcentaje
Tenga en cuenta que obtengo los valores en tiempo de ejecución.
const resDetails = await request.post(baseURL, { data: viewData }); info = await JSON.parse(JSON.stringify(await resDetails.json()));Aquí es de donde vino el archivo json:
orders = await info.data.orders.map((x) => (total: x.order_items.map(y => Number(y.order_price) * y.amount).reduce((total, y) => y+total), shipping_fee : Number(x.shipping_fee), e_charges: Number(Number((x.order_items.map(y=> Number(y.order_price) * y.amount).reduce((total, y) => Number(y+total)) + Number(x.shipping_fee)) * 0.1).toFixed()), order_items: x.order_items.map((y) => ({ item_id : y.item_id, quantity: y.amount, price: Number(y.order_price), total: Number(y.order_price) * y.amount)})) Pude obtener el 10% pero mi principal problema es agregar el otro 8% sin mapear, reducir y agregar la tarifa de shipping_fee nuevamente.
Number(Number((x.order_items.map(y=> Number(y.order_price) * y.amount).reduce((total, y) => Number(y+total)) + Number(x.shipping_fee)) * 0.1).toFixed())Soy bastante nuevo en el mundo de javascript/mecanografiado. Espero que alguien pueda ayudarme a encontrar una forma más optimizada de lograr lo que necesito. Gracias.
Puede pasar por el siguiente código. No soy un gran fanático de hacer map , reduce y cálculos en una sola línea porque quita la legibilidad. Entonces, dividí los cálculos en varios métodos.
Al final, el total del pedido se calcula solo una vez y se guardan los porcentajes de e_charges en 2 claves diferentes e_charges_8 y e_charges_10 , que creo que puede modificar según sus necesidades.
let orders = [ { "shipping_fee": 58, "order_items": [ { "item_id": 6291020872, "quantity": 1, "price": 88 }, { "item_id": 7755274567, "quantity": 1, "price": 150 }, { "item_id": 7980571205, "quantity": 1, "price": 45 }, { "item_id": 12612977930, "quantity": 1, "price": 280 } ] }, { "shipping_fee": 58, "order_items": [ { "item_id": 6291020872, "quantity": 1, "price": 88 }, { "item_id": 7755274567, "quantity": 1, "price": 150 }, { "item_id": 7980571205, "quantity": 1, "price": 45 }, { "item_id": 12612977930, "quantity": 1, "price": 280 } ] } ] const getOrderItemTotal = (orderItem) => { return orderItem.quantity * orderItem.price } const getPercentage = (shippingFee, total, percentage) => { return ((total + shippingFee) * percentage).toFixed() } const getOrderItemsTotal = (orderItems) => { return orderItems.reduce((total, orderItem) => (total + orderItem.total), 0) } orders = orders.map(order => { order.order_items.map(orderItem => { orderItem.total = getOrderItemTotal(orderItem) return orderItem }) order.total = getOrderItemsTotal(order.order_items) order.e_charges_8 = getPercentage(order.shipping_fee, order.total, 0.1) order.e_charges_10 = getPercentage(order.shipping_fee, order.total, 0.08) return order }) console.log(orders)