CursosEmpresasBlogLiveConfPrecios

Proyecto: Actualizando el total de calorías

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

    Comprendo la facilidad que ofrece el uso de jQuery en el proyecto para seleccionar elementos del DOM; pero, creo que hubiera estado más acorde con la onda EcmaSript-ProgramaciónFuncional, si en lugar de jQuery, se hubiera usado JavaScript vanilla: document.querySelector('#id-selector') …

    ¡Aún así, el curso va muy bien!
    Seguimos.

      Gabriel De Andrade

      Gabriel De Andrade

      student•
      hace 7 años

      Agregando a esto recuerdo que se puede usar la propiedad textContent de JavaScript para lograr cambiar el texto quedando algo así:
      document.querySelector('#id-selector').textContent = 'value'

      ¡Coincido, muy buen curso!

      Jor ge

      Jor ge

      student•
      hace 7 años

      También podría quedar de la siguiente manera:

      let descripcion = document.getElementById('descripcion') descripcion.value = 'texto'
    Victor Lozada

    Victor Lozada

    student•
    hace 7 años

    Si les parece mas rápido y sencillo utilizar la nomenclatura de jQuery $('#element') para acceder a los elementos del dom, pueden hacer uso de esta sin necesidad de cargar la librería con la siguiente función:

    //probando en la home de platzi (https://platzi.com/) desde la consola const $ = element => document.querySelector(element) const spanNumber = $('#home-v4 > div > div.HeroContent > div > div.HeroContent-content > div.HeroContent-stats > div > div:nth-child(1) > span:nth-child(1)') console.log(spanNumber) // nos mostrara un elemento span

    ++AVISO++: de esta forma no podrás usar los métodos de jQuery como val() o text() ,pero tendrás disponibles todos los métodos nativos de los elementos HTML como .innerText o .textContent entre muchísimos mas claro.

    Carlos Eduardo Gomez García

    Carlos Eduardo Gomez García

    teacher•
    hace 5 años

    Veo esto y veo Vue y recuerdo por qué amo Vue jaja, con Vue solo tienes que actualizar el valor y ya Vue se encarga de actualizar todo el en DOM xD

    Carlos David Sanchez Moreno

    Carlos David Sanchez Moreno

    student•
    hace 7 años

    VanillaJS

    const compose = (...functions) => data => functions.reduceRight((value, func) => func(value), data) const attrsToString = (obj = {}) => { const keys = Object.keys(obj) let attrs = [] for(let i = 0; i < keys.length; i++){ let attr = keys[i] attrs.push(`${attr}="${obj[attr]}"`) } const string = attrs.join('') return string }// string const tagAttrs = obj => (content = '') => `<${obj.tag} ${obj.attrs ? ' ' : ''}${attrsToString(obj.attrs)}>content<${obj.tag}>` const tag = t => { if (typeof t === 'String'){ tagAttrs({tag: t}) }else{ tagAttrs(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 => item.map(tableCell).join('') let list = [] let description = document.getElementById('description') let calories = document.getElementById('calories') let carbs = document.getElementById('carbs') let protein = document.getElementById('proteins') let btn = document.getElementById('btn') const validateInputs = () => { description.value ? '' : description.classList.add('is-invalid') calories.value ? '' : calories.classList.add('is-invalid') carbs.value ? '' : carbs.classList.add('is-invalid') protein.value ? '' : protein.classList.add('is-invalid') if(description.value && calories.value && carbs.value && protein.value) { console.log('OK!') add() cleanInputs() updateTotals() } } btn.addEventListener('click', validateInputs) description.addEventListener('keydown', () => description.classList.remove('is-invalid')) calories.addEventListener('keydown', () => calories.classList.remove('is-invalid')) carbs.addEventListener('keydown', () => carbs.classList.remove('is-invalid')) proteins.addEventListener('keydown', () => proteins.classList.remove('is-invalid')) const add = () => { const newItem = { description: description.value, calories: parseInt(calories.value), carbs: parseInt(carbs.value), proteins: parseInt(proteins.value) } list.push(newItem) console.log(list) } const updateTotals = () => { let calories = 0, carbs = 0, proteins = 0 list.map(item => { calories += item.calories carbs += item.carbs proteins += item.proteins }) document.getElementById('totalCalories').innerHTML = calories document.getElementById('totalCarbs').innerHTML = carbs document.getElementById('totalProteins').innerHTML = proteins } const cleanInputs = () => { description.value = ' ' calories.value = ' ' carbs.value = ' ' protein.value = ' ' }
    jorge william reaño reyes

    jorge william reaño reyes

    student•
    hace 7 años

    let updateTotals = () => { let scal = items.reduce((acum,item) => acum +=parseInt(item.cal) ,0) let scarb = items.reduce((acum,item) => acum +=parseInt(item.carb) ,0) let sprote = items.reduce((acum,item) => acum +=parseInt(item.prote) ,0) }

    Jorge Méndez Ortega

    Jorge Méndez Ortega

    student•
    hace 7 años

    Ejemplo utlizando JS puro o lo que tambien 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 const 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; }; // 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 = ""; }; 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; }; // 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(); }; // 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(); } };
    Ulises German Rios Romero

    Ulises German Rios Romero

    student•
    hace 6 años

    Este es mi código para la parte de updateTotals, utilize textContent, ya que innerHTML no me convence mucho para este caso

    //Las puse a parte por si se usan en otro momento, si no simplemente se pasan a la función const totalCalories = document.getElementById('totalCalories') const totalCarbs = document.getElementById('totalCarbs') const totalProteins = document.getElementById('totalProteins') const updateTotals = () => { let calories = 0, carbs = 0, protein= 0 list.map(item => { calories += item.calories, carbs += item.carbs, protein += item.protein }) console.log(calories) totalCalories.textContent = calories totalCarbs.textContent = carbs totalProteins.textContent = protein }
    Manuel Rivera

    Manuel Rivera

    student•
    hace 6 años
    // update total inputs function updateTotals () { let calories = 0, carbs = 0, protein = 0; List.map(item => { calories += item.calories; carbs += item.carbs; protein += item.protein; }) document.querySelector('#totalCalories').innerHTML = calories; document.querySelector('#totalCarbs').innerHTML = carbs; document.querySelector('#totalProtein').innerHTML = protein; }```
    César Augusto Cortés Labrada

    César Augusto Cortés Labrada

    student•
    hace 3 años

    Para evitar escribir tantas veces document.getElementById podemos crear una función, este caso le llamé nodeId, recibe como parámetro el id del elemento html que deseamos obtener. Esto lo aprendí de otro estudiante en el curso de profesional de asincronismo con Juan DC.

    const nodeId = (node) => document.getElementById(node); //Función que actualiza los valores totales const updateTotals = () => { let calories = 0, carbs =0, protein = 0; list.forEach(item => { calories += item.calories; carbs += item.carbs; protein += item.protein; }); nodeId("totalCalories").textContent = calories; nodeId("totalCarbs").textContent = carbs; nodeId("totalProtein").textContent = protein; console.log(calories, carbs, protein) }
    Eder Raúl Abarca Raviela

    Eder Raúl Abarca Raviela

    student•
    hace 3 años

    Mi versión de la función updateTotals() usando reduce:

    function updateTotals() { let totals = dataList.reduce((acc, num)=> { acc = [acc[0]+ num['calories'], acc[1]+ num['carbs'], acc[2]+ num['protein']]; return acc }, [0,0,0]) // console.log(totals); totalCalories.innerText = totals[0]; totalCarbs.innerText = totals[1]; totalProtein.innerText = totals[2]; }
    Irving Juárez

    Irving Juárez

    student•
    hace 4 años

    Desde mi personal punto de vista, yo hubiera hecho la función con un .forEach, ya que el este método hace casi lo que hace un ciclo for, lo que vendría siendo el recorrer todo el arreglo y ya, sin regresar ningún tipo de array nuevo, como en el caso de .map

    Carlos Enrique Ramírez Flores

    Carlos Enrique Ramírez Flores

    student•
    hace 6 años

    Mi función con parseFloat porque me estaba concatenando!

    const updateTotals = () =&gt; { let cal = 0, carb = 0, prot = 0; list.map(item =&gt; { cal += parseFloat(item.calories), carb += parseFloat(item.carbs), prot += parseFloat(item.protein) }) document.getElementById('totalCalories').textContent= cal; document.getElementById('totalCarbs').textContent= carb; document.getElementById('totalProtein').textContent= prot; }```
    Manuel Rivera

    Manuel Rivera

    student•
    hace 6 años

    Para los que validaron anteriormente como yo lo hice, en esta clase les arrojará un error, hay que agregar una línea de código en la siguiente función.

    // tagAttrs function tagAttrs (obj, content = '') { if (!obj.attrs) obj = {...obj, attrs: {}} return ( `<${obj.tag}${Object.keys(obj.attrs).length > 0 && ' '}${attrsToString(obj.attrs)}>${content}</${obj.tag}>` ) }```
    Byron Mesias Cueva Cabrera

    Byron Mesias Cueva Cabrera

    student•
    hace 5 años

    Yo lo hice así:

    const updateTotals = () => { let calories = 0, carbs = 0, protein = 0; list.forEach(item => { calories += item.calories carbs += item.carbs protein += item.protein }) const query = document.querySelector.bind(document) query('#totalCalories').textContent = calories query('#totalCarbs').textContent = carbs query('#totalProtein').textContent = protein }
    Eduardo Pech

    Eduardo Pech

    student•
    hace 5 años

    Así quedó en VanillaJS

    const $totalCalories = document.getElementById("totalCalories"); const $totalCarbs = document.getElementById("totalCarbs"); const $totalProtein = document.getElementById("totalProtein"); const updateTotals = () => { let calories = 0; let carbs = 0; let protein = 0; list.map((item) => { calories += item.calories; carbs += item.carbs; protein += item.protein; }); $totalCalories.textContent = calories; $totalCarbs.textContent = carbs; $totalProtein.textContent = protein; };

    .textContent resulta text/plain mientras que innerHTML resulta text/html

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