CursosEmpresasBlogLiveConfPrecios

Proyecto: Agregar elementos a la lista

Clase 12 de 23 • Curso de Programación Funcional en JavaScript por Bedu

Clase anteriorSiguiente clase

Contenido del curso

Introducción al curso y conceptos base

  • 1
    Qué aprenderás sobre la programación funcional

    Qué aprenderás sobre la programación funcional

    01:57 min
  • 2
    Programación funcional: qué es

    Programación funcional: qué es

    00:15 min
  • 3
    Boilerplate: Base para el proyecto del curso

    Boilerplate: Base para el proyecto del curso

    02:16 min

Funciones

  • 4
    Funciones Algebraicas y Funciones de JavaScript

    Funciones Algebraicas y Funciones de JavaScript

    02:49 min
  • 5
    Qué son funciones puras

    Qué son funciones puras

    02:45 min
  • 6
    Proyecto: Obtener el valor de los inputs

    Proyecto: Obtener el valor de los inputs

    04:00 min
  • 7
    Objetos y Tipos de Memoria en JavaScript

    Objetos y Tipos de Memoria en JavaScript

    04:31 min
  • 8
    Copiar y modificar objetos en JavaScript

    Copiar y modificar objetos en JavaScript

    09:49 min
  • 9
    Utilizando inmutabilidad en nuestras funciones

    Utilizando inmutabilidad en nuestras funciones

    03:49 min
  • 10
    Proyecto: Validar inputs

    Proyecto: Validar inputs

    07:38 min

Estado compartido en funciones

  • 11
    Estado compartido o shared state

    Estado compartido o shared state

    06:24 min
  • 12
    Proyecto: Agregar elementos a la lista

    Proyecto: Agregar elementos a la lista

    Viendo ahora

Composición de funciones, Closures y Currying

  • 13
    Funciones compuestas o Function Composition

    Funciones compuestas o Function Composition

    09:34 min
  • 14
    Completando las funciones para generar etiquetas HTML

    Completando las funciones para generar etiquetas HTML

    06:14 min
  • 15
    Closures en programación funcional

    Closures en programación funcional

    02:56 min
  • 16
    Currying

    Currying

    03:14 min
  • 17
    Proyecto: Construyendo filas y celdas

    Proyecto: Construyendo filas y celdas

    03:45 min

Higher Order Functions

  • 18
    Introducción a las Higher Order Functions

    Introducción a las Higher Order Functions

    04:11 min
  • 19
    Proyecto: Actualizando el total de calorías

    Proyecto: Actualizando el total de calorías

    05:32 min
  • 20
    Proyecto: Mostrar elementos

    Proyecto: Mostrar elementos

    03:36 min
  • 21
    Proyecto: Eliminar elementos

    Proyecto: Eliminar elementos

    09:45 min

Bonus: Declarative Programming

  • 22
    Programación Declarativa

    Programación Declarativa

    06:30 min

Conclusiones

  • 23
    Conclusiones

    Conclusiones

    01:30 min
  • Tomar el examen del curso
    • Julio J Yépez

      Julio J Yépez

      student•
      hace 7 años

      El estilo usado por el profesor para definir funciones como constantes y no como functions se llama regularmente en JavaScript: arrow function, aunque en términos más generales también las podemos encontrar como funciones lambda y es una característica introducida por EcmaScript.

        Julio J Yépez

        Julio J Yépez

        student•
        hace 7 años

        Acá un poco más sobre este tipo de funciones:

        • https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Funciones/Arrow_functions
        • https://hacks.mozilla.org/2015/06/es6-in-depth-arrow-functions/
        Carlos Gómez Mont

        Carlos Gómez Mont

        student•
        hace 7 años

        Gracias por compartir, saludos!!

      Edward Fernandez

      Edward Fernandez

      student•
      hace 6 años

      Si no quieren utilizar parseInt pueden colocar '+' antes y les hará el cast a entero:

      const newItem = { description: description.value, calories: +calories.value, carbs: +carbs.value, protein: +protein.value, }```
        Carlos Enrique Ramírez Flores

        Carlos Enrique Ramírez Flores

        student•
        hace 6 años

        creo que es algo confuso, pero funciona!

        Manuel Rivera

        Manuel Rivera

        student•
        hace 6 años

        huy este truco no me lo sabía, tiene efectos secundarios y por que sucede eso al agregar + ?

      José Barrios Pulido

      José Barrios Pulido

      student•
      hace 7 años

      Dejo mi aporte, codigo en JS puro

      const compose = (...functions) => data => functions.reduceRight((value, func)=> func (value), data) const description = document.getElementById("description"); const calorias = document.getElementById("calories"); const carbohidratos = document.getElementById("carbs"); const proteinas = document.getElementById("protein"); const button = document.getElementById('buttonplus') const IS_INVALID = 'is-invalid' const inputs = [description,calorias,carbohidratos,proteinas] let list = [] // si parametro(las variables) que pase por la función tiene un valor, es valido const isValid = elem => elem.value // El formulario será valido cuando todos los argumentos de cada funcion tenga un valor (estos ya pasaron para ser // validados en la funcion anterior) const isFormValid = () => isValid(description) && isValid(calorias) && isValid(carbohidratos) && isValid(proteinas) // si el parametro que se pase por esta funcion tiene no tiene valor: '' (comprobado por la funcion isValid) // entonces agregale una clase que se llame 'is-invalid' const showInvalid = elem => isValid(elem) ? '' : elem.classList.add(IS_INVALID) // el elemento que pase por la funcion se le pondrá un evento al digitar una tecla, cuando esto suceda se le quitara la clase is-invalid' const addKeyDownEvent = elem => elem.addEventListener('keydown', ()=> elem.classList.remove(IS_INVALID)) // recorre la funcion addKeyDownEvent poniendole los nombres de los inputs del array inputs.forEach(addKeyDownEvent) // recorra los elementos del array en la funcion showInvalid y luego si la condicion de la funcion isFormValid // se cumple (Todos los imput tiene algun valor) realiza la funcion add() const validateInputs = () => { inputs.forEach(showInvalid) if(isFormValid()) { add() } } // adiciona los valores del formulario al array vacio list y despues limpia el formulario const add = () => { const newItem = { description: description.value, calorias: calorias.value, carbohidratos: carbohidratos.value, proteinas: proteinas.value, } list.push(newItem) cleanInputs() console.log(list) } // Limpia el formulario const cleanInputs = () => { description.value ='' calorias.value ='' carbohidratos.value ='' proteinas.value ='' }
        José Agustin Rios

        José Agustin Rios

        student•
        hace 6 años

        Flaco, gracias

      Mario Alejandro Cortez Salinas

      Mario Alejandro Cortez Salinas

      student•
      hace 7 años

      Si alguien prefiere usar VanillaJS así pueden limpiar los campos
      let cleanInputs = () => {
      description.value = ''
      calories.value = 0
      carbs.value = 0
      protein.value = 0
      }

        Beatriz Pérez Santana

        Beatriz Pérez Santana

        student•
        hace 7 años

        A los otros campos también les puse un string vacío porque entonces te sustituye el valor del placeholder por un 0

        const cleanInputs = () => { description.value = ""; carbs.value = ""; calories.value = ""; protein.value = ""; };
      Carlos Eduardo Gomez García

      Carlos Eduardo Gomez García

      teacher•
      hace 5 años

      Aquí hay cosas que no me cuadran... es decir, en capítulos pasados vimos que mutar la variable global no era correcto, pero aquí si la estamos mutando... ¿Es por fines prácticos del curso?...

      Alejandro Saucedo

      Alejandro Saucedo

      student•
      hace 7 años

      igual en lugar de list.push() se puede hacer uso del spread operator
      list = […list, newItem]

      const compose = (...functions) => data => functions.reduceRight((value, func) => func(value), data) description.onkeypress = () => { description.classList.remove('is-invalid') } carbs.onkeypress = () => { carbs.classList.remove('is-invalid') } calories.onkeypress = () => { calories.classList.remove('is-invalid') } protein.onkeypress = () => { protein.classList.remove('is-invalid') } let list = []; const validateInputs = () => { description.value ? '' : description.classList.add('is-invalid') carbs.value ? '' : carbs.classList.add('is-invalid') calories.value ? '' : calories.classList.add('is-invalid') protein.value ? '' : protein.classList.add('is-invalid') if (description.value && carbs.value && calories.value && protein.value) { add() } } const add = () => { const newItem = { description: description.value, calories: parseInt(calories.value), carbs: parseInt(carbs.value), protein: parseInt(protein.value) } list = [...list, newItem] cleanInputs() console.log(list) } const cleanInputs = () => { description.value = '' carbs.value = '' calories.value = '' protein.value = '' }
      elvis rosario

      elvis rosario

      student•
      hace 6 años

      por favor alquien que me guie como empezar a practicar en javascript ,estoy nuevo en todo esto y realmente necesito ayuda ,que necesito hacer para empezar a practicar creando una webside utilizando javascribt

        Mario Peña

        Mario Peña

        student•
        hace 6 años

        Primero que nada te recomiendo que veas este curso y lo practiques bastante: Fundamentos de JavaScript. Hay excelente contenido allí.

        elvis rosario

        elvis rosario

        student•
        hace 6 años

        muchas gracias mi rey

      Angelo Zambrano

      Angelo Zambrano

      student•
      hace 6 años

      Código sin JQuery:

      vanilla-js.png

      Guadalupe Monge Barale

      Guadalupe Monge Barale

      student•
      hace 3 años

      Al usar arrow function, (teniendo en cuenta que el hoisting no se aplica, ya que solo es para la palabra reservada function y var - Esto se explica en el curso básico de js) ¿es lo mismo llamarlas y luego declararlas o es mejor declararlas primero?

      Funciona igual el código, pero pregunto cuál es la mejor práctica . Esta

      const cleanInputs = () => { description.value = '' calories.value = 0 carbs.value = 0 protein.value = 0 } const add = () => { const newItem = { description: description.value, calories: parseFloat(calories.value), carbs:parseFloat(carbs.value), protein: parseFloat(protein.value) } list.push(newItem) cleanInputs() console.log(list); }

      O esta

      const add = () => { const newItem = { description: description.value, calories: parseFloat(calories.value), carbs:parseFloat(carbs.value), protein: parseFloat(protein.value) } list.push(newItem) cleanInputs() console.log(list); } const cleanInputs = () => { description.value = '' calories.value = 0 carbs.value = 0 protein.value = 0 }
        David Colin

        David Colin

        teacher•
        hace 3 años

        Es buena práctica primero declarar y luego usar, también es más fácil para ti cuando busques tus funciones por si sale algún error 😉

      Eder Raúl Abarca Raviela

      Eder Raúl Abarca Raviela

      student•
      hace 3 años

      Dejo mi aporte de como sería la versión funcional de la función add():

      list = add(list); function add(list) { return withArrayCopy(list, (copy) =>{ copy.push( { description: description.value, calories: parseInt(calories.value), carbs: parseInt(carbs.value) , protein: parseInt( protein.value) } ); }); } function withArrayCopy(arr, callback) { let copy = [...arr]; callback(copy); return copy; }
      Martín Gutiérrez Hernández

      Martín Gutiérrez Hernández

      student•
      hace 3 años
      Emily Perea

      Emily Perea

      student•
      hace 7 años

      ¿la función cleanInputs es una función pura?

        Fernanda Aragon

        Fernanda Aragon

        student•
        hace 7 años

        Hola, clearInputs() no es una función pura ya que depende de factores externos como los inputs para efectuar su ejecución, además no recibe argumentos para trabajar con ellos y retornar un valor predecible. Te dejo un concepto rápido de las funciones puras: Las funciones puras no dependen de factores externos y son predecibles, trabajan con los argumentos que asignamos y siempre devuelve el mismo resultado dependiendo de los argumentos pasados.

      Cristian Manuel Gonzalez Blanco

      Cristian Manuel Gonzalez Blanco

      student•
      hace 3 años
      () =>
      Alejandro Mejia Escobar

      Alejandro Mejia Escobar

      student•
      hace 4 años

      Si quieren que la información de list no se pierda cada vez que recargan la página, pueden almacenarla en el localstorage. Algo importante es que en el localstorage sólo se pueden almacenar cadenas de texto, por fortuna, como ya hemos visto, JSON.stringify nos permite convertir un objeto en una cadena de texto

      let list = (localStorage.getItem('list')) ? JSON.parse(localStorage.getItem('list')) : []

      Y cada vez que actualicen la lista con la función add, tambien actualizan la variable del localstorage.

      localStorage.setItem('list', JSON.stringify(list))
      Mario Vizcaino

      Mario Vizcaino

      student•
      hace 4 años

      Una forma de probar data o de crear elementos de un array para simular datos podria ser asi:

      Array(cantidad_de_veces_a_repetir).fill(dato_con_el_que_quieres_rellenar_tu_array)

      Ejemplo:

      Array(5).fill(1) // [1,1,1,1,1]
      Brayan Murcia Sanchez

      Brayan Murcia Sanchez

      student•
      hace 7 años

      profe una pregunta, si quisiera editar uno de los elementos como selecciono el item del array, pues lo hice recorriendo el array con un for, pero tengo esa sensación de que no es la forma optima de hacerlo

      for (var i in list) { if (list[i].value == value) { list[i].desc = desc; break; } }
        Ana Lima

        Ana Lima

        student•
        hace 7 años

        ¡Hola!

        En caso de que solamente quieras modificar un valor, no te recomiendo usar un ciclo para hacer eso.

        Como buenas prácticas, te recomiendo que utilices los ciclos cuando vayas a realizar modificaciones en 2 o más elementos.

        Fernando Alejandro Yerena Ramos

        Fernando Alejandro Yerena Ramos

        student•
        hace 7 años

        Puedes utilizar el método .filter() Lo que hará es devolverte un array con los elementos que cumplan con la condición que decidas.

        let item = list.filter(currentItem => currentItem == value)

        Te recomiendo estas lecturas con respecto al tema:

        • Array.prototype.filter()
        • JavaScript — Learn to Chain Map, Filter, and Reduce
        • Learn & Understand JavaScript’s Filter Function
      Eddy Arellanes

      Eddy Arellanes

      student•
      hace 7 años

      En este ejemplo, ¿No sería más correcto en la función add, mandar como parámetro la descripción, calorías y proteínas. Porque de otra manera no se está aplicando el concepto de funciones puras.

        Revés Estal

        Revés Estal

        student•
        hace 7 años

        Seria igual, ya que la función add esta tomando es el valor de la propiedad value, que retorna un string. En ningún momento se usa la referencia a un objeto.

      Jorge Méndez Ortega

      Jorge Méndez Ortega

      student•
      hace 7 años

      Por si le funciona a le funciona dejo mi ejemplo donde estoy utilizando JS puro sin utilizarjQuery

      const compose = (...functions) => data => functions.reduceRight((value, func) => func(value), data); // Se utiliza $ para identificar que una variable o constante hace referencia // a elementos del DOM const $DESCRIPTION = document.getElementById("description"); const $CALORIAS = document.getElementById("calorias"); const $CARBOIDRATOS = document.getElementById("carboidratos"); const $PROTEINAS = document.getElementById("proteinas"); const ERROR_CLASS = "is-invalid"; const SUCCESS_CLASS = "is-valid"; // Arreglo de elementos const LIST = []; // Asignacion de evntos siempre que se desea asignar un evento aun elemento del DOM // es necesario utilizar addEventListener $DESCRIPTION.addEventListener("keypress", () => $DESCRIPTION.classList.remove(ERROR_CLASS)); $CALORIAS.addEventListener("keypress", () => $CALORIAS.classList.remove(ERROR_CLASS)); $CARBOIDRATOS.addEventListener("keypress", () => $CARBOIDRATOS.classList.remove(ERROR_CLASS)); $PROTEINAS.addEventListener("keypress", () => $PROTEINAS.classList.remove(ERROR_CLASS)); // Limpiando inputs const cleanInputs = () => { $DESCRIPTION.classList.remove(SUCCESS_CLASS); $DESCRIPTION.value = ""; $CALORIAS.classList.remove(SUCCESS_CLASS); $CALORIAS.value = ""; $CARBOIDRATOS.classList.remove(SUCCESS_CLASS); $CARBOIDRATOS.value = ""; $PROTEINAS.classList.remove(SUCCESS_CLASS); $PROTEINAS.value = ""; }; // Agregar elementos en la lista const addElement = () => { const newItem = { description: $DESCRIPTION.value, calorias: $CALORIAS.value, carboidratos: $CARBOIDRATOS.value, proteinas: $PROTEINAS.value, }; LIST.push(newItem); cleanInputs(); }; // funcion para validar los inputs const validateInputs = () => { // Por cuestion de buenas practicas el resultado de una condición // Ternaria tiene que ser asignada a una variable o constante const DESCRIPTION_CLASS = (($DESCRIPTION.value) ? SUCCESS_CLASS : ERROR_CLASS); $DESCRIPTION.classList.add(DESCRIPTION_CLASS); const CALORIAS_CLASS = (($CALORIAS.value) ? SUCCESS_CLASS : ERROR_CLASS); $CALORIAS.classList.add(CALORIAS_CLASS); const CARBOIDRATOS_CLASS = (($CARBOIDRATOS.value) ? SUCCESS_CLASS : ERROR_CLASS); $CARBOIDRATOS.classList.add(CARBOIDRATOS_CLASS); const PROTEINAS_CLASS = (($PROTEINAS.value) ? SUCCESS_CLASS : ERROR_CLASS); $PROTEINAS.classList.add(PROTEINAS_CLASS); if ($DESCRIPTION.value && $CALORIAS.value && $CARBOIDRATOS.value && $PROTEINAS.value) { addElement(); } };
      GABRIELA VALLENILLA

      GABRIELA VALLENILLA

      student•
      hace 6 años

      Para agregar los nuevos elementos a la lista no debería ser de forma inmutable también?

      Jorge Alberto Alvarez Sone

      Jorge Alberto Alvarez Sone

      student•
      hace 6 años
      code.png

    Escuelas

    • Desarrollo Web
      • Fundamentos del Desarrollo Web Profesional
      • Diseño y Desarrollo Frontend
      • Desarrollo Frontend con JavaScript
      • Desarrollo Frontend con Vue.js
      • Desarrollo Frontend con Angular
      • Desarrollo Frontend con React.js
      • Desarrollo Backend con Node.js
      • Desarrollo Backend con Python
      • Desarrollo Backend con Java
      • Desarrollo Backend con PHP
      • Desarrollo Backend con Ruby
      • Bases de Datos para Web
      • Seguridad Web & API
      • Testing Automatizado y QA para Web
      • Arquitecturas Web Modernas y Escalabilidad
      • DevOps y Cloud para Desarrolladores Web
    • English Academy
      • Inglés Básico A1
      • Inglés Básico A2
      • Inglés Intermedio B1
      • Inglés Intermedio Alto B2
      • Inglés Avanzado C1
      • Inglés para Propósitos Específicos
      • Inglés de Negocios
    • Marketing Digital
      • Fundamentos de Marketing Digital
      • Marketing de Contenidos y Redacción Persuasiva
      • SEO y Posicionamiento Web
      • Social Media Marketing y Community Management
      • Publicidad Digital y Paid Media
      • Analítica Digital y Optimización (CRO)
      • Estrategia de Marketing y Growth
      • Marketing de Marca y Comunicación Estratégica
      • Marketing para E-commerce
      • Marketing B2B
      • Inteligencia Artificial Aplicada al Marketing
      • Automatización del Marketing
      • Marca Personal y Marketing Freelance
      • Ventas y Experiencia del Cliente
      • Creación de Contenido para Redes Sociales
    • Inteligencia Artificial y Data Science
      • Fundamentos de Data Science y AI
      • Análisis y Visualización de Datos
      • Machine Learning y Deep Learning
      • Data Engineer
      • Inteligencia Artificial para la Productividad
      • Desarrollo de Aplicaciones con IA
      • AI Software Engineer
    • Ciberseguridad
      • Fundamentos de Ciberseguridad
      • Hacking Ético y Pentesting (Red Team)
      • Análisis de Malware e Ingeniería Forense
      • Seguridad Defensiva y Cumplimiento (Blue Team)
      • Ciberseguridad Estratégica
    • Liderazgo y Habilidades Blandas
      • Fundamentos de Habilidades Profesionales
      • Liderazgo y Gestión de Equipos
      • Comunicación Avanzada y Oratoria
      • Negociación y Resolución de Conflictos
      • Inteligencia Emocional y Autogestión
      • Productividad y Herramientas Digitales
      • Gestión de Proyectos y Metodologías Ágiles
      • Desarrollo de Carrera y Marca Personal
      • Diversidad, Inclusión y Entorno Laboral Saludable
      • Filosofía y Estrategia para Líderes
    • Diseño de Producto y UX
      • Fundamentos de Diseño UX/UI
      • Investigación de Usuarios (UX Research)
      • Arquitectura de Información y Usabilidad
      • Diseño de Interfaces y Prototipado (UI Design)
      • Sistemas de Diseño y DesignOps
      • Redacción UX (UX Writing)
      • Creatividad e Innovación en Diseño
      • Diseño Accesible e Inclusivo
      • Diseño Asistido por Inteligencia Artificial
      • Gestión de Producto y Liderazgo en Diseño
      • Diseño de Interacciones Emergentes (VUI/VR)
      • Desarrollo Web para Diseñadores
      • Diseño y Prototipado No-Code
    • Contenido Audiovisual
      • Fundamentos de Producción Audiovisual
      • Producción de Video para Plataformas Digitales
      • Producción de Audio y Podcast
      • Fotografía y Diseño Gráfico para Contenido Digital
      • Motion Graphics y Animación
      • Contenido Interactivo y Realidad Aumentada
      • Estrategia, Marketing y Monetización de Contenidos
    • Desarrollo Móvil
      • Fundamentos de Desarrollo Móvil
      • Desarrollo Nativo Android con Kotlin
      • Desarrollo Nativo iOS con Swift
      • Desarrollo Multiplataforma con React Native
      • Desarrollo Multiplataforma con Flutter
      • Arquitectura y Patrones de Diseño Móvil
      • Integración de APIs y Persistencia Móvil
      • Testing y Despliegue en Móvil
      • Diseño UX/UI para Móviles
    • Diseño Gráfico y Arte Digital
      • Fundamentos del Diseño Gráfico y Digital
      • Diseño de Identidad Visual y Branding
      • Ilustración Digital y Arte Conceptual
      • Diseño Editorial y de Empaques
      • Motion Graphics y Animación 3D
      • Diseño Gráfico Asistido por Inteligencia Artificial
      • Creatividad e Innovación en Diseño
    • Programación
      • Fundamentos de Programación e Ingeniería de Software
      • Herramientas de IA para el trabajo
      • Matemáticas para Programación
      • Programación con Python
      • Programación con JavaScript
      • Programación con TypeScript
      • Programación Orientada a Objetos con Java
      • Desarrollo con C# y .NET
      • Programación con PHP
      • Programación con Go y Rust
      • Programación Móvil con Swift y Kotlin
      • Programación con C y C++
      • Administración Básica de Servidores Linux
    • Negocios
      • Fundamentos de Negocios y Emprendimiento
      • Estrategia y Crecimiento Empresarial
      • Finanzas Personales y Corporativas
      • Inversión en Mercados Financieros
      • Ventas, CRM y Experiencia del Cliente
      • Operaciones, Logística y E-commerce
      • Gestión de Proyectos y Metodologías Ágiles
      • Aspectos Legales y Cumplimiento
      • Habilidades Directivas y Crecimiento Profesional
      • Diversidad e Inclusión en el Entorno Laboral
      • Herramientas Digitales y Automatización para Negocios
    • Blockchain y Web3
      • Fundamentos de Blockchain y Web3
      • Desarrollo de Smart Contracts y dApps
      • Finanzas Descentralizadas (DeFi)
      • NFTs y Economía de Creadores
      • Seguridad Blockchain
      • Ecosistemas Blockchain Alternativos (No-EVM)
      • Producto, Marketing y Legal en Web3
    • Recursos Humanos
      • Fundamentos y Cultura Organizacional en RRHH
      • Atracción y Selección de Talento
      • Cultura y Employee Experience
      • Gestión y Desarrollo de Talento
      • Desarrollo y Evaluación de Liderazgo
      • Diversidad, Equidad e Inclusión
      • AI y Automatización en Recursos Humanos
      • Tecnología y Automatización en RRHH
    • Finanzas e Inversiones
      • Fundamentos de Finanzas Personales y Corporativas
      • Análisis y Valoración Financiera
      • Inversión y Mercados de Capitales
      • Finanzas Descentralizadas (DeFi) y Criptoactivos
      • Finanzas y Estrategia para Startups
      • Inteligencia Artificial Aplicada a Finanzas
      • Domina Excel
      • Financial Analyst
      • Conseguir trabajo en Finanzas e Inversiones
    • Startups
      • Fundamentos y Validación de Ideas
      • Estrategia de Negocio y Product-Market Fit
      • Desarrollo de Producto y Operaciones Lean
      • Finanzas, Legal y Fundraising
      • Marketing, Ventas y Growth para Startups
      • Cultura, Talento y Liderazgo
      • Finanzas y Operaciones en Ecommerce
      • Startups Web3 y Blockchain
      • Startups con Impacto Social
      • Expansión y Ecosistema Startup
    • Cloud Computing y DevOps
      • Fundamentos de Cloud y DevOps
      • Administración de Servidores Linux
      • Contenerización y Orquestación
      • Infraestructura como Código (IaC) y CI/CD
      • Amazon Web Services
      • Microsoft Azure
      • Serverless y Observabilidad
      • Certificaciones Cloud (Preparación)
      • Plataforma Cloud GCP

    Platzi y comunidad

    • Platzi Business
    • Live Classes
    • Lanzamientos
    • Executive Program
    • Trabaja con nosotros
    • Podcast

    Recursos

    • Manual de Marca

    Soporte

    • Preguntas Frecuentes
    • Contáctanos

    Legal

    • Términos y Condiciones
    • Privacidad
    • Tyc promociones
    Reconocimientos
    Reconocimientos
    Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
    Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
    Logo reconocimientoPrimera Startup EdTech · 2018
    Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
    Logo reconocimientoCEO Mejor Emprendedor del año · 2024
    De LATAM conpara el mundo
    YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads