function esPar (numero) { if (numero % 2 == 0) { return true } else { return false } } function mismaParidad (num1, num2) { if (esPar(num1) == esPar(num2)) { return true } else { return false } } function filtrarPares (array) { const resultado = [] for (let i = 0; i < array.length; i++) { if (esPar(array[i])) { resultado.push(array[i]) } } return resultado } function sumaPares (array) { const pares = filtrarPares(array) let suma = 0 for (let i = 0; i < pares.length; i++) { suma += pares[i] } return suma } function padNumero (numero) { if (!esPar(numero.length)) { numero = '0' + numero } return numero }
Ejercicio
En el ejemplo anterior de los usuarios muestro el nombre. Quiero que, al lado del nombre, salga el correo electrónico y la ciudad.
Cambiar la siguiente línea:
usuario.innerHTML = resultado[i].name + ‘, ‘ + resultado[i].email + ‘, ‘ + resultado[i].address.city
Fetch + JSON + API + BD typicode
<div id="contenedor" class="container "> <button id="recuperar" class="btn btn-success">Recuperar</button> <div id="usuarios"></div> </div> <script src="js/test.js"></script>
document.getElementById('recuperar').addEventListener('click', recuperar) function recuperar () { fetch('https://jsonplaceholder.typicode.com/users') .then(function (response) { return response.text() }) .then(function (html) { console.log(html) const resultado = JSON.parse(html) console.log(resultado) for (let i = 0; i < resultado.length; i++) { const usuario = document.createElement('p') usuario.innerHTML = resultado[i].name document.getElementById('usuarios').appendChild(usuario) } }) .catch(function (err) { console.log('Error: ', err) }) }
fetch + JSON + API: Cartas
<div id="contenedor" class="container "> <button id="empezar" class="btn btn-success">Empezar</button> <p id="mensaje"></p> <button id="carta" class="btn btn-success">Sacar una carta</button> <button id="carta5" class="btn btn-success">Sacar cinco cartas</button> <div id="cartas"></div> </div> <script src="js/test.js"></script>
document.getElementById('empezar').addEventListener('click', empezar) document.getElementById('carta').addEventListener('click', carta) document.getElementById('carta5').addEventListener('click', cartas) let baraja function carta () { fetch('https://deckofcardsapi.com/api/deck/' + baraja + '/draw/?count=1') .then(function (response) { return response.text() }) .then(function (html) { console.log(html) const resultado = JSON.parse(html) console.log(resultado) const imagen = document.createElement('img') imagen.src = resultado.cards[0].image document.getElementById('cartas').appendChild(imagen) }) .catch(function (err) { console.log('Error: ', err) }) } function empezar () { fetch('https://deckofcardsapi.com/api/deck/new/shuffle/?deck_count=1') .then(function (response) { return response.text() }) .then(function (html) { console.log(html) const resultado = JSON.parse(html) console.log(resultado) baraja = resultado.deck_id document.getElementById('mensaje').innerHTML = 'Tienes la baraja: ' + baraja }) .catch(function (err) { console.log('Error: ', err) }) } function cartas () { fetch('https://deckofcardsapi.com/api/deck/' + baraja + '/draw/?count=5') .then(function (response) { return response.text() }) .then(function (html) { const resultado = JSON.parse(html) for (let i = 0; i < resultado.cards.length; i++) { const imagen = document.createElement('img') imagen.src = resultado.cards[i].image document.getElementById('cartas').appendChild(imagen) } }) .catch(function (err) { console.log('Error: ', err) }) }
Fetch + Json ejemplo bitcoin
<div id="contenedor" class="container "> <h1>Hoy el bitcoin está a <span id="cotizacion"></span></h1> Cuantos bitcoins tienes: <input type="number" id="bitcoins" value="0"> <button id="calcular">Calcular</button> <h3>Tienes: <span id="cartera"></span> €</h3> </div> <script src="js/test.js"></script>
document.getElementById('calcular').addEventListener('click', calcular) function calcular () { fetch('https://api.coindesk.com/v1/bpi/currentprice.json') .then(function (response) { // Si tengo respuesta return response.text() // El html de la página me lo pasas al siguiente then }) .then(function (html) { // Dentro de html yo tengo la respuesta de la página console.log(html) const objeto = JSON.parse(html) console.log(objeto) console.log(objeto.bpi.EUR.rate) const cantidad = parseFloat(document.getElementById('bitcoins').value) document.getElementById('cotizacion').innerHTML = objeto.bpi.EUR.rate document.getElementById('cartera').innerHTML = objeto.bpi.EUR.rate_float * cantidad }) .catch(function (err) { console.log('Error: ', err) }) }
Ejemplo fetch: perritos
<div id="contenedor" class="container "> <img id="imagen" src="" width="300"> <video id="video" controls src=""> </video> </div> <script src="js/test.js"></script>
fetch('https://random.dog/woof.json?ref=apilist.fun') .then(function (response) { // Si tengo respuesta console.log(response) return response.text() // El html de la página me lo pasas al siguiente then }) .then(function (html) { // Dentro de html yo tengo la respuesta de la página console.log(html) const perrito = JSON.parse(html) console.log(perrito) // Solo me interesa la url del perrito const url = perrito.url // Obtengo la extensión del archivo const extension = url.split('.').pop() // SI es vídeo lo pongo en el vídeo y oculto la imagen y viceversa if (extension == 'mp4') { const video = document.getElementById('video') video.src = url document.getElementById('imagen').style.display = 'none' } else { document.getElementById('imagen').src = url document.getElementById('video').style.display = 'none' } }) .catch(function (err) { console.log('Error: ', err) })
Mini ejercicio JSON
Vamos a tener una web con dos cajitas:
Num1:[___] Num2:[___]
[Calcular]
El botón calcular nos calcula la suma y guarda en el localStorage un elemento llamado ‘resultado’ que es un objeto con la siguiente info:
{
num1: (valor del numero1),
num2: (valor del numero2),
suma: (valor de la suma)
}
No hace falta hacer nada más: recuperar, calcular, guardar en localStorage
Num1: <input type="number" id="numInput1"> Num2: <input type="number" id="num2"> <button id="calcular">Calcular</button> <script src="js/local.js"></script>
document.getElementById('calcular').addEventListener('click', calcular) function calcular () { const numero1 = parseFloat(document.getElementById('numInput1').value) const num2 = parseFloat(document.getElementById('num2').value) console.log(numero1, num2) const suma = numero1 + num2 // Creo el objeto const resultado = { num1: numero1, num2: num2, // Si estás poniendo lo mismo 'num2' ¿Esto no da un error? No, porque en la parte izquierda es el NOMBRE de la propiedad y en la derecha es el VALOR de la variable suma: suma // Yo recomiendo que los nombres sean los mismos en todo el recorrido, nos evita errores } console.log(resultado) // Lo guardo convertido en JSON localStorage.setItem('resultado', JSON.stringify(resultado)) }
Ejemplo JSON
<div id="contenedor" class="container "> Nombre:<input type="text" id="nombre"> Edad:<input type="text" id="edad"> Sueldo:<input type="number" id="sueldo"> <button id="guardar" class="btn btn-success">Guardar datos</button> </div> <script src="js/test.js"></script>
document.getElementById('guardar').addEventListener('click', guardar) // Recupero el valor del localStorage const guardado = localStorage.getItem('empleado') // SI hay datos if (guardado != null) { console.log(guardado) // Convierto la cadena en objeto (parse) const empleado = JSON.parse(guardado) console.log(empleado) // Pongo los datos en el HTML document.getElementById('nombre').value = empleado.nombre document.getElementById('edad').value = empleado.edad document.getElementById('sueldo').value = empleado.sueldo } function guardar () { // Recupero los datos del HTML const nombre = document.getElementById('nombre').value const edad = document.getElementById('edad').value const sueldo = document.getElementById('sueldo').value // Creo un objeto con esos datos const empleado = { nombre: nombre, sueldo: sueldo, edad: edad } // Lo convierto a cadena (stringify) y lo guardo en el localStorage localStorage.setItem('empleado', JSON.stringify(empleado)) }
See the Pen
qBqjOYz by Juan Pablo Fuentes (@juan-pablo-fuentes)
on CodePen.
JSON: un formato de datos universal
Entrada en la wikipedia:
https://es.wikipedia.org/wiki/JSON
Tutorial w3School completo:
https://www.w3schools.com/js/js_json_intro.asp
Explicación y recursos:
https://desarrolloweb.com/home/json
Como usarlo en JS:
https://lenguajejs.com/javascript/caracteristicas/json/
JSON vs XML
Mini ejercicio fechas
Tenemos una web y quiero que me muestre en unos inputs la información del día de hoy:
Día: [___] Mes: [___] Año: [___] Día de la semana: [___]
El mes en letra. Todo dentro de inputs.
<div id="contenedor" class="container "> Día:<input type="text" id="dia"> Mes:<input type="text" id="mes"> Año:<input type="text" id="anyo"> Día de la semana:<input type="text" id="diasemana"> </div> <script src="js/test.js"></script>
const hoy = new Date() const dias = ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'] const mes = ['Enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'] document.getElementById('dia').value = hoy.getDate() document.getElementById('mes').value = mes[hoy.getMonth()] document.getElementById('anyo').value = hoy.getFullYear() // hoy.getDay()--> 0->Domingo, 1->Lunes, 2->Martes...6->Sábado document.getElementById('diasemana').value = dias[hoy.getDay()]