CursosEmpresasBlogLiveConfPrecios

Proyecto: Eliminar elementos

Clase 21 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

    05:36 min

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

    Viendo ahora

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

      Algo interesante que se ve en esta clase es cómo cada vez que se hace algún cambio a la lista es necesario llamar a la función que vacía la tabla y luego la que hace el render de los items. Esto sucede porque se está usando jQuery como librería de renderizado.

      Otras librerías (o frameworks) como React, Angular o Vue no requieren el renderizado manual con cada cambio de estado porque utilizan un paradigma de programación llamado reactivo basado en el patrón de diseño de Observers. Entidades de ES que permiten detectar el cambio de “estado” y ejecutar el re-renderizado de los elementos del DOM cuyo valor/contenido dependan de éste. (bueno … más o menos) 😉

      Algunas referencias sobre este tema:

      • Observer (patrón de diseño)
      • ¿Qué es la Programación Reactiva? Una introducción
      • El Manifiesto de los Sistemas Reactivos
        David Antonio Ordóñez Cornejo

        David Antonio Ordóñez Cornejo

        student•
        hace 7 años

        Muy bueno el aporte.

        Yulissa Terán Cerquín

        Yulissa Terán Cerquín

        student•
        hace 7 años

        Además de Angular, ¿React y Vue también usan observers?

      Juan Castro

      Juan Castro

      teacher•
      hace 7 años

      La función .map de JavaScript puede recibir un segundo argumento que por convención se llama index y nos sirve para obtener la posición de un elemento dentro de nuestro array 👍.

      • Learn & Understand JavaScript’s Map Function - codeburst
        Carlos Gómez Mont

        Carlos Gómez Mont

        student•
        hace 7 años

        Super aporte, gracias!!

        Daniel Castillo

        Daniel Castillo

        student•
        hace 7 años

        También recibe como tercero el Array al que pertenece el elemento

      Jorge Méndez Ortega

      Jorge Méndez Ortega

      student•
      hace 7 años

      Practica general del curso sin utilizar jQuery 🤢, para este caso solo se utilizo JS puro lo cual también se conoce como vanilla.

      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 let LIST = []; // consiguiendo los atributes para las etiquetas HTML const attributesToString = (obj = {}) => { const ENTRIES = Object.entries(obj); const ATTRS = []; for (let i = 0; i < ENTRIES.length; i += 1) { const AUX = ENTRIES[i]; const ATTR = AUX[0]; const VALUE = AUX[1]; ATTRS.push(`${ATTR}="${VALUE}"`); } return ATTRS.join(""); }; // Creando etiquetas html con atributos const createTagAttr = obj => (content = "") => { const { tag, attr } = obj; return ` <${tag}${attr ? ` ${attributesToString(attr)}` : ""}> ${content} </${tag}>`; }; // Generando tag de maner dinamica const createTag = (tag) => { const TAG = (typeof tag === "string") ? createTagAttr({ tag }) : createTagAttr(tag); return TAG; }; const trashIcon = createTag({ tag: "i", attr: { class: "fas fa-trash-alt" } })(""); const tableCell = createTag("td"); const tableCells = items => items.map(tableCell).join(""); const tableRowTag = createTag("tr"); const tableRow = items => compose(tableRowTag, tableCells)(items); // 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 = ""; }; // Actualizando totales const updateTotals = () => { let carboidratos = 0; let proteinas = 0; let calorias = 0; // Por buenas praxticas se utiliza un forEach y cumple la mism funcion que se busca // practicamente una funcion de alto orden, no utiizo el map por que map siempre regresa // algo y de momento no importa capturar lo que regresa la iteracion que realizamos. LIST.forEach((item) => { carboidratos += item.carboidratos; proteinas += item.proteinas; calorias += item.calorias; }); document.querySelector("#totalCalorias").textContent = calorias; document.querySelector("#totalCarboidratos").textContent = carboidratos; document.querySelector("#totalProteinas").textContent = proteinas; }; // Permite realizar el rendereo de los items const renderItems = () => { // otra manera de poder obtener un elemento por el name TAG // solo que este metodo consigue un arreglo de elementos const $CONTAINER = document.getElementsByTagName("tbody")[0]; $CONTAINER.innerHTML = ""; const ROWS = LIST.map((item, index) => { const { calorias, description, carboidratos, proteinas, } = item; const removeButton = createTag({ tag: "button", attr: { class: "btn btn-outline-danger", onclick: `removeItem(${index})`, }, })(trashIcon); return tableRow([description, calorias, carboidratos, proteinas, removeButton]); }); $CONTAINER.innerHTML = ROWS.join(""); }; // Agregar elementos en la lista const addElement = () => { const newItem = { description: $DESCRIPTION.value, calorias: parseInt($CALORIAS.value, 10), carboidratos: parseInt($CARBOIDRATOS.value, 10), proteinas: parseInt($PROTEINAS.value, 10), }; LIST.push(newItem); cleanInputs(); updateTotals(); renderItems(); }; // 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(); } }; // Permite remover un item seleccionado const removeItem = (position) => { LIST = LIST.filter((item, index) => position !== index); updateTotals(); renderItems(); };
      Victor Lozada

      Victor Lozada

      student•
      hace 7 años

      Otra forma de eliminar el item de la lista es utilizando el metodo .filter() quedaria asi:

      const removeItem = (index) => { //list.splice(index,1) esto sera sustituido por el código debajo list = list.filter((item,i) => i !== index) updateTotals() renderItems() }

      Para saber mas sobre este método : Array.prototype.filter() - MDN 👍🏻

        Usuario anónimo

        Usuario anónimo

        user•
        hace 5 años

        Super! Gracias :)

      Sebastián Buitrago

      Sebastián Buitrago

      student•
      hace 5 años

      Viendo este proyecto con JS Vanilla y con JQuery veo que los frameworks como react o vue o angular disminuyen demasiado el trabajo, lo hacen ver sencillo a comparacion de JS Vanilla

      Carlos Eduardo Gomez García

      Carlos Eduardo Gomez García

      teacher•
      hace 5 años

      La función tag() que creamos me recuerda mucho a la función h() de Vue cuando usamos renderFunctions, solo que digamos que ahí la función es un poco más poderosa por así decirlo.

      Y el usar esas funciones con JavaScript para crear elementos se resuelve con JSX xD

      Francisco Garcia [C6]

      Francisco Garcia [C6]

      student•
      hace 5 años

      Muy interesante.

      const compose = (...functions) => data => functions.reduceRight((value, func) => func(value), data) const attrsToString = (obj = {}) => Object.keys(obj).map(attr => `${attr}="${obj[attr]}"`).join(' ') const tagAtrrs = obj => (content = "") => `<${obj.tag}${obj.attrs ? ' ' : ''}${attrsToString(obj.attrs)}>${content}</${obj.tag}>` const tag = t => typeof t === 'string' ? tagAtrrs({tag: t}) : tagAtrrs(t) const tableRowTag = tag('tr') //const tableRow = items => tableRowTag(tableCells(items)) const tableRow = items => compose(tableRowTag, tableCells)(items) const tableCell = tag('td') const tableCells = items => items.map(tableCell).join('') const trashIcon = tag({tag: 'i', attrs: {class: 'fas fa-trash-alt'}})('') let description = $('#description') let calories = $('#calories') let carbs = $('#carbs') let protein = $('#protein') let list = [] description.keypress(() => { description.removeClass('is-invalid') }) calories.keypress(() => { calories.removeClass('is-invalid') }) carbs.keypress(() => { carbs.removeClass('is-invalid') }) protein.keypress(() => { protein.removeClass('is-invalid') }) const validateInputs = () => { description.val() ? '' : description.addClass('is-invalid') calories.val() ? '' : calories.addClass('is-invalid') carbs.val() ? '' : carbs.addClass('is-invalid') protein.val() ? '' : protein.addClass('is-invalid') if( description.val() && calories.val() && carbs.val() && protein.val() ) add() } const add = () => { const newItem = { description: description.val(), calories: parseInt(calories.val()), carbs: parseInt(carbs.val()), protein: parseInt(protein.val()) } list.push(newItem); cleanInputs() updateTotals() renderItems() } const updateTotals = () => { let calories = 0, carbs = 0, protein = 0 list.map( item => { calories += item.calories; carbs += item.carbs; protein += item.protein; }) $('#totalCalories').text(calories) $('#totalCarbs').text(carbs) $('#totalProtein').text(protein) } const cleanInputs = () => { description.val('') calories.val('') carbs.val('') protein.val('') } const renderItems = () => { $('tbody').empty() list.map((item, index ) => { const removeButton = tag({ tag: 'button', attrs: { class: 'btn btn-outline-danger', onclick: `removeItem(${index})` } })(trashIcon) $('tbody').append(tableRow([item.description, item.calories, item.carbs, item.protein, removeButton])) }) } const removeItem = (index) => { list.splice(index, 1) updateTotals() renderItems() }
      Julio J Yépez

      Julio J Yépez

      student•
      hace 7 años

      En el min 05:02 se observa cómo se cambia la sintaxis de la arrow function de item => { a (item, index) => {. Esto es porque al recibir solo un parámetro, no es necesario encerrarlo entre paréntesis, pero cuando es más de uno sí.

      Javier Romero

      Javier Romero

      student•
      hace 5 años

      si dice el profesor que bootstrap lo tiene todo la pregunta es, como lo instaló sino tiene ni siquiera un node_modules para que sea alojado... yo observé en la carpeta de css un archivo llamado bootstrap.main.css con un montón de código que me tiene loco de tanto verlo, de donde saco ese archivo es mi pregunta o como lo instalo??

        sofia mejia

        sofia mejia

        student•
        hace 5 años

        Usando la CDN, acá está la documentación https://getbootstrap.com/docs/4.3/getting-started/introduction/

        No necesitas node

        Javier Romero

        Javier Romero

        student•
        hace 5 años

        Hola Sofia, ya leí la CDN y es solamente poner una etiqueta link en head y las etiquetas scripts en un archivo HTML, hasta ahí muy bien y lo puedo hacer, pero la pregunta es esta, después de hacer todo lo que me explica la CDN como hago que aparezca este archivo -> bootstrap.main.css???

      Eder Raúl Abarca Raviela

      Eder Raúl Abarca Raviela

      student•
      hace 3 años

      Simplifiqué el código de tableRow() y la función que genera el botón de borrado (buttonGenerator(idx)) para mayor claridad (par mí):

      function tableRow(array) { return `<tr> <td>${array[0]}</td> <td>${array[1]}</td> <td>${array[2]}</td> <td>${array[3]}</td> ` } function buttonGenerator(idx){ return `<td><button class="btn btn-outline-danger" onclick="removeItem(${idx})"> <i class="fas fa-trash-alt"></i> </button></td></tr>`; }
      Alejandro Mejia Escobar

      Alejandro Mejia Escobar

      student•
      hace 4 años

      Si estás guardando la lista en el localStorage, recuerda actualizarla al momento de eliminar el elemento de la lista

      const removeItem = index => { list.splice(index, 1); updateTotals(); renderItems(); localStorage.setItem('list', JSON.stringify(list)) }
      Tomas Goldenberg

      Tomas Goldenberg

      student•
      hace 6 años

      Cuando elimino el item me dice que deleteItem no esta definida pero si lo esta ademas la funcion me aparece sombreada como si nunca la hubiese llamado

      const deleteItem= (index)=>{ list.splice(index,1)

      updateTotals() renderItems() } const renderItems = () =&gt; { const listWrapper = document.querySelector('tbody') listWrapper.innerHTML = &quot;&quot; list.map((item,index) =&gt; { const boton = tag({ tag:&quot;button&quot;, attrs:{ class:&quot;btn btn-outline-danger&quot;, onclick: `deleteItem(${index}) ` }, })(trashIcon) listWrapper.innerHTML += tableRow([ item.description, item.calories, item.carbs, item.protein, boton ]) }) }

    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