En este caso yo evitaría usar el switch ya que este tendría que realizar muchos pasos para llegar a la condicional que queremos. Yo usaría un objeto de la siguiente manera:
Luego pasaría el input de descuento a texto. Validaría de la siguiente manera el descuento que se quiere aplicar:
functionpercentage(price){let total;const discountOnNumber = discounts[discount.value];if(!discountOnNumber)return"Discount cannot be found"; total =Number((price *(100- discountOnNumber))/100);return`$${total}`;}
Podría validarse el tipo de dato de las variables para asegurar que son textos o números en caso de que se quiera aplicar un descuento en número directamente en vez de un cupón.
Una pregunta, ¿En donde comparas el input del descuento del usuario con tu variable discounts?
Me ayudó muchísimo tu solución. Usé una lógica un poco distinta, pero me funcionó de guía tu ejercicio. Muchas gracias.
Esta fue mi solución, si me pueden hacer criticas seria genial
Me encanta que hayas creado la clase para los cupones. :clap:
me seria muy util poder ver todo el codigo, me sirvio mucho
Hice el ejercicio de códigos de descuento de la siguente forma:
Pueden ver mi código aquí
Antonio, en los screenshots tu proyecto se ve SUUUUPER bien. Quería ir a Codepen a darle una estrellita, pero cuando lo abrí no me funcionó. :sob:
¿Podrías revisarlo por fa para darle la merecidísima estrellita?
Ya lo corregí. Los códigos de descuento que se pueden utilizar son:
platzi
VMX50
MM89X
JUL99
Lo hice de dos maneras:
1. array de Objetos:
let promotion =[{'Platzi Vacation':15},{'Platzi Weekend':30},{'Platzi New Year':45},];/**Promotion code */btn.addEventListener('click',()=>{if(!input1.value||!input2.value){ p.innerText='Please, insert values for both price and promotion code!';}else{if(promotion.flatMap(item=>Object.keys(item)).includes(input2.value)){let discount =(+input1.value*(100- promotion.find(item=> item[input2.value])[input2.value]))/100; p.innerText=`You get a ${promotion.find(item=> item[input2.value])[input2.value]}% off. Price with discount: $${discount}`;}else{ p.innerText='There is no promotion with this code.';}}});
2. Objetos:
let promotion ={'Platzi Vacation':15,'Platzi Weekend':30,'Platzi New Year':45,};/**Promotion code */btn.addEventListener('click',()=>{if(!input1.value||!input2.value){ p.innerText='Please, insert values for both price and promotion code!';}else{if(Object.keys(promotion).includes(input2.value)){let discount =(+input1.value*(100- promotion[input2.value]))/100; p.innerText=`You get a ${promotion[input2.value]}% off. Price with discount: $${discount}`;}else{ p.innerText='There is no promotion with this code.';}}});
Estas en lo correcto, creo que mas allá de usar objetos. Lo ideal es utilizar arrays, ya que no sabemos cuantos cupones pueden existir en un proyecto real.
Objetos con forEach
const inputPrice =document.querySelector('#price')const inputCoupon =document.querySelector('#coupon')const btn =document.querySelector('#calcular')const pResult =document.querySelector('#result')const coupons =[{name:'Managua',discount:15},{name:'Sol',discount:20}]btn.addEventListener('click', calcularPrecioConDescuento)functioncalcularPrecioConDescuento(){const price =Number(inputPrice.value)const coupon = inputCoupon.valuelet newPrice
if(!price ||!coupon){ pResult.innerText='Por favor llena el formulario'return} coupons.forEach(item=>{if(item.name=== coupon) newPrice =(price *(100- item.discount))/100}) pResult.innerText= newPrice
?'Precio con descuento es $'+ newPrice
:'Cupon no es valido'}```
:D Estas clases hacen que vea lo mucho que he aprendidooo! No se si me fui muy lejos porque llegue a usar mapas pero me encanto la experiencia de tratar de hacer este ejercicio con arrays de objetos! Es la primera vez que programo algo así cualquier sugerencia de como podría hacerlo menos complejo es bien recibida :)
//.....const inputPrice =document.querySelector('#price');const inputCoupon =document.querySelector('#coupon')const btn =document.querySelector('#calculate');const pResult =document.querySelector('#result')btn.addEventListener('click', calculatePriceWithDiscount);const coupons =[{name:'summer',discount:20},{name:'fall',discount:25},{name:'winter',discount:30},]coupons.push({name:'spring',discount:40});// adding an object to the array of objectscoupons.push({name:'pokemon',discount:50});// adding another object to the array of objectsconsole.log(coupons);const arrayKeys = coupons.map((coupon)=> coupon.name).flat();console.log("Keys", arrayKeys);// creating an array with the namesconst arrayValues = coupons.flatMap((coupon)=> coupon.discount);console.log("values", arrayValues);// creating an array with the valuesfunctioncalculatePriceWithDiscount(){const price =Number(inputPrice.value);const coupon = inputCoupon.value;let discount;if(arrayKeys.includes(coupon)){for(let i =0; i < arrayKeys.length; i++){//console.log(arrayKeys[i])if(arrayKeys[i]== coupon){console.log(arrayKeys[i]);console.log(arrayValues[i]); discount = arrayValues[i]}}}else{ pResult.innerText="The coupon is not valid"return;}const newPrice =(price *(100- discount))/100;pResult.innerText="The price with discount is $"+ newPrice;}
Aquí mi calculador de descuentos
Hola a todos, acá les comparto el reto de la clase. Los cupones se pueden ingrersar en JavaScript cambiando un objeto y automáticamente se muestran en la página (esto solamente con fines educativos):
Acá pueden ver la página desplegada en GitHub Pages y el código lo encuentran en mi repositorio. Saludos.
Antes del minuto 1:00
Me tardé varias horas, pero me gusto el resultado.
!Clase-8
Aqui pueden ver mi código: Repositorio, commit: clase 8
Se acepta feedback. C:
Intenté que fuese un poco más iterable, para que no fuese los condicionales tan especificos.
Entonces creé un objeto con los cupones y sus respectivos porcentajes.
const cupones ={cupon1:20,cupon2:30,cupon3:50,};
Despues me puse a la tarea de crear los condicionales ( que como les dije, me sacaron canas), no lograba entender muy bien como iterar el objeto para poder condicionarlo adecuadamente.
SIn embargo, encontré :
let claves =Object.keys(cupones);
Que me permitió volverlo iterable.
Ahí fue solo entender bien como filtrar con el método .find.
Les dejo mi solución:
const precio =document.querySelector(".precio").value;const descuento =document.querySelector(".descuento");const button =document.querySelector(".button");const resultado =document.querySelector(".resultado");const valor=document.createElement("p");const formatterPeso =newIntl.NumberFormat('es-CO',{style:'currency',currency:'COP',minimumFractionDigits:0});const cupones ={cupon1:20,cupon2:30,cupon3:50,};let claves =Object.keys(cupones);let formula;constaddClassBlue=()=>{ valor.classList.add("valor"); valor.classList.remove("valormal");};constremoveClassBlue=()=>{ valor.classList.add("valormal"); valor.classList.remove("valor");};button.addEventListener("click", mostrarResultado);functionmostrarResultado(){let b = claves.find(dis=(nombre)=>{return nombre==descuento.value;});console.log(b==descuento.value)if(b==descuento.value){ formula =(Number(precio)*(100-Number(cupones[descuento.value]))/100); resultado.appendChild(valor); valor.innerHTML="El valor final de tu compra es: "+formatterPeso.format(formula);addClassBlue(); descuento.value="";}else{ resultado.appendChild(valor); valor.innerHTML="Por favor digita un cupon correcto"; descuento.value="";removeClassBlue();}}
Realicé el reto sin eliminar la opción porcentaje de descuento, los cupones los validé creando un array con "llaves:valor". En este caso, me preocupé por realizar las validaciones principales y solo permitiendo el porcentaje de descuento o el cupón.
Espero que esto les ayude.
El JS queda de la siguiente manera:
const btnDcto =document.querySelector('.btnDcto');let precioValor=document.querySelector('.precioValor');let resultado =document.querySelector('.resultado');btnDcto.addEventListener('click',()=>{let precio =Number(document.querySelector('.precio').value);let dcto =Number(document.querySelector('.descto').value);const cupon =document.querySelector('.cupon').value.toUpperCase();let imprDcto =document.querySelector('.valorDcto');let porcentaje =(precio*(100-dcto))/100;const listaCupones=[{A1:10},{B1:20},{C1:30},{D1:40},{E1:50},{F1:60},{G1:70},{H1:80},{I1:90},{'J1':100}];if(cupon &&!dcto){//Validamos cupon true y dcto false.//Usamos una función flecha en el metodo find()como callback, es decir, asignamos un parametro a la funcion flecha para que retorne el valor, solo si este valor no es igual a undefined. Este parametro que retorna es la llave valor que encontró y se convierte en el valor de cuponValido.let cuponValido = listaCupones.find(obj=> obj[cupon]!==undefined);console.log(cuponValido);if(cuponValido){//Si es true, es decir, si encontró el valor en el array.//cuponValido[cupon] toma solo el valor de la llave valor obtenidos.let valorCupon = cuponValido[cupon];//Aplicamos el cupón de descuento.let dctoCupon =(precio*(100-valorCupon))/100; resultado.innerText=`Precio = ${precio}€.
Cupón de Descuento = ${valorCupon}%.
Precio final = ${dctoCupon}€.
`}else{ resultado.innerText=`¡Tu cupón no es valido! :(
Por favor ingresa un cupón válido.`}}elseif(dcto>=100){ resultado.innerText=`¡Ya quisieras!
El porcentaje no puede ser igual o mayor que el 100%.`}elseif(dcto && cupon){ resultado.innerText=`Lo sentimos.
!Los cupones y descuentos no son acumulables¡`;}elseif(dcto &&!cupon){ resultado.innerText=`Precio = ${precio}€.
Descuento = ${dcto}%.
Precio final = ${porcentaje}€.
`}else{ resultado.innerText=`¡Oh! lo sentimos :(
¡Debes llenar los dos campos con valore válidos para poder calcular un descuento!`}})
El HTML quedaría así:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Descuentos</title></head><body><label for="precio">Ingresa el precio del producto</label><input type="text"class="precio"><br><label for="descto">Ingresa el porcentaje de descuento</label><input type="text"class="descto"><br><label for="cupon">Ingresa el Cupón</label><input type="text"class="cupon"><br><button type="button" name="Enviar"class="btnDcto">Calcular</button><div><p class="resultado"></p></div></body><script type="text/javascript" src="descuentos.js"></script></html>
Con esta clase le agregue un poco de dificultad al ejercicio y decidi que el usuario pudiera escoger si hacer descuento porcentual o por cupon
Por aca dejo el Javascript
Script 1
const inputproductvalue =document.querySelector('.hero__section__container__left__side--inputnumber')const inputpercent =document.querySelector('.hero__section__container__left__side--inputpercent')const submitbutton =document.querySelector('.hero__section__container__left__side--buttonsubmits')const submitbuttoncoupon =document.querySelector('.hero__section__container__left__side--buttonsubmitcoupon')const percentbutton =document.querySelector('.hero__section__container__buttonscontainer--percent')const couponbutton =document.querySelector('.hero__section__container__buttonscontainer--coupon')const containerbuttons =document.querySelector('.hero__section__container__buttonscontainer')const returnbutton=document.querySelector('.hero__section__container__left__side--buttonreturn')const returnbutton2 =document.querySelector('.hero__section__container__left__side--buttonreturn2')const form1 =document.querySelector('.hero__section__container__left_side__formcontainer--form')const textresult =document.querySelector('.hero__section__container__left__side__formcontainer--text')const percentform =document.querySelector('.hero__section__container__left_side__formcontainer--form')const couponform =document.querySelector('.hero__section__container__left_side__formcontainer2--form')const errorcontainer =document.querySelector('.error__popup')const errorclosecontainer=document.querySelector('.error__popup__buttoncontainer--closetext')let productvalue1, productpercent1;let productvalue2 , productcoupon;const discountcoupons =[{coupon:"mothersday",discount:10},{coupon:"summer20",discount:20},{coupon:"weekends",discount:50},]percentbutton.addEventListener('click',openpercentform)couponbutton.addEventListener('click',opencouponform)form1.addEventListener('submit', sumadeporcentaje)returnbutton.addEventListener('click', closeform)returnbutton2.addEventListener('click',closeform)couponform.addEventListener('submit',couponsdiscount)errorclosecontainer.addEventListener('click',closepopup)functionclosepopup(){ errorcontainer.classList.remove('error__popup--display') errorcontainer.classList.add('error__container')}functioncloseform(event){ event.preventDefault() percentform.classList.remove('hero__section__container__left_side__formcontainer--formdisplay') couponform.classList.remove('hero__section__container__left_side__formcontainer2--form--display') containerbuttons.classList.add('hero__section__container__buttonscontainer') containerbuttons.classList.remove('hero__section__container__buttonscontainer--hidden')}functionopencouponform(){ couponform.classList.toggle('hero__section__container__left_side__formcontainer2--form--display') percentform.classList.remove('hero__section__container__left_side__formcontainer--formdisplay') percentform.classList.add('hero__section__container__left_side__formcontainer--form') containerbuttons.classList.remove('hero__section__container__buttonscontainer') containerbuttons.classList.add('hero__section__container__buttonscontainer--hidden')}functionopenpercentform(){ percentform.classList.add('hero__section__container__left_side__formcontainer--formdisplay') containerbuttons.classList.remove('hero__section__container__buttonscontainer') containerbuttons.classList.add('hero__section__container__buttonscontainer--hidden') couponform.classList.remove('hero__section__container__left_side__formcontainer--formdisplay') couponform.classList.add('hero__section__container__left_side__formcontainer')}functionsumadeporcentaje(event){if(sumadeporcentaje =true){console.log({event});// evitamos que la pagina se recargue cuando hagamos uso del formulario event.preventDefault()// establecemos nuestros parametros y usamos el console log para revisar si no tenemos ninguna falla y los valores se estan impriendo en consola correctamente productvalue1 =parseFloat(inputproductvalue.value); productpercent1 =parseFloat(inputpercent.value);// guardamos los valores para posteriormente mostrar el resultados en la otra pagina del htmllocalStorage.setItem('productvalue', inputproductvalue.value);localStorage.setItem('discountvalue', inputpercent.value);console.log('Este es valor guardado en memoria'+' '+localStorage.getItem('productvalue'))console.log(localStorage.getItem('discountvalue'))// Esta formula nos va permitir saber el descuento del productolet total =((productvalue1 *(100- productpercent1))/100)console.log(total)localStorage.setItem('totalfinal', total)console.log('Este es valor guardado en memoria del total'+' '+localStorage.getItem('totalfinal'))window.location.href='result.html';}}functioncouponsdiscount(event){ event.preventDefault()const inputcoupon=document.querySelector('.hero__section__container__left__side--inputcoupon')const coupondiscountvalue = discountcoupons.find(couponObj=> couponObj.coupon=== inputcoupon.value.trim());const inputproductvalue2 =parseFloat(document.querySelector('.hero__section__container__left__side--inputnumber2').value);if(coupondiscountvalue){console.log('Este es valor guardado en memoria'+' '+localStorage.getItem('productvalue'))console.log(localStorage.getItem('coupondiscount'))let total =((inputproductvalue2 *(100- coupondiscountvalue.discount))/100)console.log(total)localStorage.setItem('totalcoupondiscount', total)console.log(localStorage.getItem('totalcoupondiscount'))localStorage.setItem('productvalue', inputproductvalue2);localStorage.setItem('coupondiscount', coupondiscountvalue.discount);window.location.href='result2.html'}else{console.log('no funciona') errorcontainer.classList.toggle('error__popup--display')}}
const returnbutton =document.querySelector('.result__hero__leftcontainer--returnbutton');const totalFinal =localStorage.getItem('totalcoupondiscount');// Cambiado de 'totalcoupondiscount' a 'totalfinal'const discountvalue =parseFloat(localStorage.getItem('coupondiscount'));// Corregido 'ParseFloat' a 'parseFloat'const producttvalue =parseFloat(localStorage.getItem('productvalue'));// Corregido 'ParseFloat' a 'parseFloat'const productvaluetext =document.querySelector('.resulthero__rightcontainer__titlerow1--productvaluetitle');const productvaluefinaltext =document.querySelector('.resulthero__rightcontainer__titlerow2--productfinalvalue');const productdiscountvaluetext =document.querySelector('.resulthero__rightcontainer__titlerow2--productdiscount');returnbutton.addEventListener('click', pager);console.log(totalFinal);// Verificar el valor de totalFinalconsole.log(discountvalue);// Verificar el valor de discountvalueconsole.log(producttvalue);// Verificar el valor de producttvaluefunctionpager(){console.log("Esta funcionando");window.location.href='index.html';}productvaluetext.innerText="$"+" "+ producttvalue;productvaluefinaltext.innerText="$"+" "+ totalFinal;productdiscountvaluetext.innerText="("+"%"+ discountvalue +")";
Espectacular! Lo tienes publicado en algún repo?
Acabo de publicarlo para que puedan probarlo , puedes pobrar con el cupon mothersday para comprobar su funciona o no
Lo hice con codigo sencillo de entender, aqui les dejo la vista de como quedo:
Aqui el codigo JS :P
const precioInicialInput =document.querySelector('.costo-inicial');const cuponPorcentajeInput =document.querySelector('.cupon-ingresado');const botonCalculo =document.querySelector('.boton');const pResult =document.querySelector('#result')const coupons ={diaMadres:50,valentin:20,christmas:30,blackFriday:55,}botonCalculo.addEventListener('click', calcularPrecioFinal);functioncalcularPrecioFinal(event){ event.preventDefault();const cuponPorcentaje = coupons[cuponPorcentajeInput.value];console.log(cuponPorcentaje);const precioInicial = precioInicialInput.valueconsole.log('prueba');if(!precioInicial ||!cuponPorcentajeInput.value){ pResult.innerText="Ingresa los datos que se requieren para calcular el costo final que deseas"return;}if(!cuponPorcentaje){ pResult.innerText="el cupon que ingresaste es invalido, vuelve a ingresar el nombre del cupon (tener presente mayusculas y minusculas)"return;}const resta =(100- cuponPorcentaje)const newPrice =(precioInicial * resta)/100; pResult.innerText='El nuevo precio con descuento es $'+ newPrice;};
aqui el codigo HTML
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>calculos a la mano</title><link rel="stylesheet" type="text/css" href="descuento.css"/></head><body class="body"><div class="div-general"><h1 class="titulo">Calcula el precio final</h2><div class="texto"><p>Ingresando el costo inicial y el porcentaje de descuento al que aplique, descubriras el costo final a pagar.</p></div><div class="valores"><form class="form"><label>CostoInicial:<input type="number"class="costo-inicial label"/></label><br /><label>Cupon:<input type="text"class="cupon-ingresado label"/></label><br /><button value="Submit"class="boton">Calcular</button
><br /><p id="result"></p></form></div></div><script src="./descuento.js"></script></body></html>
En la clase anterior en el reto de hacer este ejercicio ya habia usado los objetos por que me parecieron mas organizados y faciles de usar que poner cada cupon directamente, asi me quedo usando switch:
Javascript:
functiondescuento_code(){const cupons_code ={NeWYear2023:20,BlacKFriDay2023:50,EnDyeAr2023:60,};switch(input2_code.value){case'NeWYear2023': result_code.innerHTML=Number(input1_code.value)*(100- cupons_code["NeWYear2023"])/100;break;case'BlacKFriDay2023': result_code.innerHTML=Number(input1_code.value)*(100- cupons_code["BlacKFriDay2023"])/100;break;case'EnDyeAr2023': result_code.innerHTML=Number(input1_code.value)*(100- cupons_code["EnDyeAr2023"])/100;break;default: result_code.innerHTML="Pon un codigo de descuento valido";return;}if(!input1_code.value||!input2_code.value){ result_code.innerHTML="Pon el precio y el codigo de descuento";}}
Para resolver los errores en cada ejercicio hize lo siguiente:
un solo if:
functiondescuento_code(){const cupons_code ={NeWYear2023:20,BlacKFriDay2023:50,EnDyeAr2023:60,};if(input2_code.value== input2_code.value){ result_code.innerHTML=Number(input1_code.value)*(100- cupons_code[input2_code.value])/100;}if(!input1_code.value||!input2_code.value){ result_code.innerHTML="Pon el precio y el codigo de descuento";}elseif(input2_code.value!="NeWYear2023"&& input2_code.value!="BlacKFriDay2023"&& input2_code.value!="EnDyeAr2023"){ result_code.innerHTML="Pon un codigo de descuento valido";}}
Un solo caso:
functiondescuento_code(){const cupons_code ={NeWYear2023:20,BlacKFriDay2023:50,EnDyeAr2023:60,};switch(input2_code.value){case input2_code.value: result_code.innerHTML=Number(input1_code.value)*(100- cupons_code[input2_code.value])/100;break;}if(!input1_code.value||!input2_code.value){ result_code.innerHTML="Pon el precio y el codigo de descuento";}elseif(input2_code.value!="NeWYear2023"&& input2_code.value!="BlacKFriDay2023"&& input2_code.value!="EnDyeAr2023"){ result_code.innerHTML="Pon un codigo de descuento valido";}}
functioncalculatePriceWithDiscount(){const price =Number(inputPrice.value);const coupon = inputCoupon.value;const coupons ={hopefully_nobody_uses_this_coupon:100,who_says_no_to_a_coupon:50,yes_this_is_a_coupon:10,};if(!price ||!coupon){ result.innerText="Debes ingresar un precio y un cupón";return;}let discount;if(coupons[coupon]){ discount = coupons[coupon];}else{ result.innerText=`El cupón ${coupon} no es válido`;}const newPrice =(price *(100- discount))/100; result.innerText=`El precio con descuento es de $${newPrice}`;}
Hola! me costó muchisimo Poder integrar un input extra que funcionase junto con el input de la clase anterior, NOTA: esto no lo han enseñado lo encontre en documentación aqui les dejo el codigo HTML CSS Y JS con comentarios
;const inputDiscount =document.getElementById('discount');const inputCoupon =document.getElementById('coupon');const btn =document.querySelector('#calculate');const pAlert =document.querySelector('#alert');const pCancel =document.querySelector('#cancel__alert');const btnCancel=document.getElementById('cancel');btn.addEventListener('click', calculateDiscount);// btnCanel es un boton que se va a usar para eliminar el resultado de la funcion principalbtnCancel.addEventListener('click', cancel);functioncalculateDiscount(){const price =Number(inputPrice.value);const discount =Number(inputDiscount.value);const strikeCoupon = inputCoupon.value.trim().toLowerCase();// Este pCancel es para que se elimine el mensaje de cancelacion pCancel.innerText='';if(!price){ pAlert.innerText='Por favor, ingrese un precio válido.';return;}if(discount >70){ pAlert.innerText='Lo siento, no se pueden aplicar descuentos mayores al 70%.';return;}let newPrice = price *(100- discount)/100;let couponDiscount =0;if(strikeCoupon ==='z10'){ couponDiscount =10; newPrice = price *(100- couponDiscount)/100; pAlert.innerText=`El precio a pagar con el cupón es: $${newPrice.toFixed(2)}`;}else{ pAlert.innerText=`El precio a pagar es: $${newPrice.toFixed(2)}`;}}// Esta funcion es para eliminar los resultados del boton azulfunctioncancel(){ pAlert.innerText=''; pCancel.innerText='Descuento cancelado satisfactoriamente';}// Este add es para que se pueda ejecutar si presionamos "enter"document.addEventListener('keypress',keyEnter);functionkeyEnter(e){if(e.key==='Enter'){calculateDiscount();}}