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
  • 2
    Programación funcional: qué es

    Programación funcional: qué es

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

    Boilerplate: Base para el proyecto del curso

    02:16
Funciones
  • 4
    Funciones Algebraicas y Funciones de JavaScript

    Funciones Algebraicas y Funciones de JavaScript

    02:49
  • 5
    Qué son funciones puras

    Qué son funciones puras

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

    Proyecto: Obtener el valor de los inputs

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

    Objetos y Tipos de Memoria en JavaScript

    04:31
  • 8
    Copiar y modificar objetos en JavaScript

    Copiar y modificar objetos en JavaScript

    09:49
  • 9
    Utilizando inmutabilidad en nuestras funciones

    Utilizando inmutabilidad en nuestras funciones

    03:49
  • 10
    Proyecto: Validar inputs

    Proyecto: Validar inputs

    07:38
Estado compartido en funciones
  • 11
    Estado compartido o shared state

    Estado compartido o shared state

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

    Proyecto: Agregar elementos a la lista

    05:36
Composición de funciones, Closures y Currying
  • 13
    Funciones compuestas o Function Composition

    Funciones compuestas o Function Composition

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

    Completando las funciones para generar etiquetas HTML

    06:14
  • 15
    Closures en programación funcional

    Closures en programación funcional

    02:56
  • 16
    Currying

    Currying

    03:14
  • 17
    Proyecto: Construyendo filas y celdas

    Proyecto: Construyendo filas y celdas

    03:45
Higher Order Functions
  • 18
    Introducción a las Higher Order Functions

    Introducción a las Higher Order Functions

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

    Proyecto: Actualizando el total de calorías

    05:32
  • 20
    Proyecto: Mostrar elementos

    Proyecto: Mostrar elementos

    03:36
  • 21
    Proyecto: Eliminar elementos

    Proyecto: Eliminar elementos

    09:45
Bonus: Declarative Programming
  • 22
    Programación Declarativa

    Programación Declarativa

    06:30
Conclusiones
  • 23
    Conclusiones

    Conclusiones

    01:30
    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 5 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 5 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 5 años

      muchas gracias mi rey

    Angelo Zambrano

    Angelo Zambrano

    student•
    hace 5 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 6 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