<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Ignacio Collantes - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Ignacio Collantes - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 06 Jun 2026 19:41:48 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/luisignaciocc/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Cómo construir un menú acordeón con HTML, CSS y JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por: Kingsley Ubah [https://www.freecodecamp.org/news/author/ubahthebuilder/] Artículo original: How to Build an Accordion Menu Using HTML, CSS and JavaScript [https://www.freecodecamp.org/news/build-an-accordion-menu-using-html-css-and-javascript/] Traducido y adaptado por: Ignacio Collantes [/espanol/news/author/luisignaciocc/] Puedes utilizar HTML, CSS y JavaScript para crear elementos web elegantes y dinámicos. Y un elemento útil que puedes construir es un ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-construir-un-menu-acordeon-con-html-css-y-javascript/</link>
                <guid isPermaLink="false">61d63069148c1c09723465a1</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ignacio Collantes ]]>
                </dc:creator>
                <pubDate>Mon, 28 Feb 2022 03:23:29 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/01/accordion-canva.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original escrito por</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> </strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/author/ubahthebuilder/">Kingsley Ubah</a><br><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> </strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/build-an-accordion-menu-using-html-css-and-javascript/">How to Build an Accordion Menu Using HTML, CSS and JavaScript</a><br><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> </strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/luisignaciocc/">Ignacio Collantes</a></p><p>Puedes utilizar HTML, CSS y JavaScript para crear elementos web elegantes y dinámicos. Y un elemento útil que puedes construir es un menú acordeón.</p><p>Los menús en acordeón se expanden y contraen cuando el usuario hace clic en un botón. Es una gran manera de no tener que mostrar toda la información sobre un tema al principio, y en su lugar dar a los usuarios la opción de mostrar solo lo que necesitan.</p><p>En este tutorial, les mostraré cómo construir un menú acordeón simple que se parece a esto:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/02/Peek-2022-02-26-14-27-1.gif" class="kg-image" alt="Peek-2022-02-26-14-27-1" width="1213" height="831" loading="lazy"></figure><h2 id="-qu-es-un-men-acorde-n">¿Qué es un menú acordeón?<strong> </strong></h2><p>En el diseño de la interfaz de usuario, un menú acordeón es una lista apilada verticalmente de varias piezas de información. Para cada lista, hay una cabecera etiquetada que apunta al contenido correspondiente. El contenido de cada lista está oculto por defecto. Al hacer clic en una etiqueta concreta, se despliega su contenido.</p><p>Un caso de uso muy común para los acordeones es el de contener una lista de preguntas frecuentes. Al hacer clic en una pregunta, se mostrará la respuesta correspondiente.</p><h2 id="c-mo-construir-un-men-acorde-n-usando-html-css-y-js">Cómo construir un menú acordeón usando HTML, CSS y JS</h2><p>Comenzaremos por definir el marcado HTML. Si estás usando un IDE como VS Code y tienes emmet instalado, crea un nuevo archivo <code>index.html</code> y escribe <code>!</code> seguido de enter. Esto debería crear el código HTML para tu proyecto.</p><p>Alternativamente, puedes copiar el siguiente código en tu <code>index.html</code>, u obtener el código para este proyecto desde <a href="https://codepen.io/ubahthebuilder/pen/gORqxNe">Codepen</a>.</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
  &lt;meta http-equiv="X-UA-Compatible" content="ie=edge"&gt;
  &lt;title&gt;Documento&lt;/title&gt;
  &lt;link rel="stylesheet" href="styles.css"&gt;
&lt;/head&gt;
&lt;body&gt;

  &lt;script src="app.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre><figcaption>Estructura de la página HTML</figcaption></figure><p>La estructura de la carpeta es sencilla. Crearemos una carpeta llamada acordeón. Dentro de la carpeta crearemos tres archivos: <code>index.html</code>, <code>styles.css</code>, y <code>app.js</code>. También enlazaremos todos los archivos en nuestro marcado HTML como puedes ver arriba.</p><h3 id="marcado-html-para-el-acorde-n">Marcado HTML para el Acordeón</h3><p>Para cada lista del menú, tendremos dos <code>div</code>: uno para la etiqueta y otro para el contenido.</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;body&gt;
  &lt;div class="acordeon-cuerpo"&gt;
  &lt;div class="acordeon"&gt;
    &lt;h1&gt;Preguntas Frecuentes&lt;/h1&gt;
    &lt;hr&gt;
    &lt;div class="contenedor"&gt;
      &lt;div class="label"&gt;¿Qué es HTML?&lt;/div&gt;
      &lt;div class="content"&gt;El lenguaje de marcas de hipertexto (HTML) es un lenguaje informático que compone la mayoría de las páginas web y aplicaciones en línea. Un hipertexto es un texto que se utiliza para hacer referencia a otros fragmentos de texto, mientras que un lenguaje de marcas es una serie de marcas que indican a los servidores web el estilo y la estructura de un documento. El lenguaje HTML es muy sencillo de aprender y utilizar.&lt;/div&gt;
    &lt;/div&gt;
    &lt;hr&gt;
    &lt;div class="contenedor"&gt;
      &lt;div class="label"&gt;¿Qué es CSS?&lt;/div&gt;
      &lt;div class="content"&gt;CSS son las siglas de Cascading Style Sheets (hojas de estilo en cascada). Es el lenguaje para describir la presentación de las páginas web, incluyendo los colores, el diseño y las fuentes, haciendo así que nuestras páginas web sean presentables para los usuarios. CSS está diseñado para hacer hojas de estilo para la web. Es independiente de HTML y puede utilizarse con cualquier lenguaje de marcado basado en XML. El CSS es popularmente llamado el lenguaje de diseño de la web.
&lt;/div&gt;
    &lt;/div&gt;
    &lt;hr&gt;
    &lt;div class="contenedor"&gt;
      &lt;div class="label"&gt;¿Qué es JavaScript?&lt;/div&gt;
      &lt;div class="content"&gt;JavaScript es un lenguaje de programación que permite implementar funciones complejas en las páginas web. Cada vez que una página web hace algo más que limitarse a mostrar información estática para que la veas, mostrando actualizaciones puntuales de contenido, mapas interactivos, gráficos 2D/3D animados, videocámaras con desplazamiento, etc., puedes apostar que JavaScript está probablemente involucrado. Es el tercero del trío web.
&lt;/div&gt;
    &lt;/div&gt;
    &lt;hr&gt;
    &lt;div class="container"&gt;
      &lt;div class="label"&gt;¿Qué es React?&lt;/div&gt;
      &lt;div class="content"&gt;React es una biblioteca de JavaScript creada para construir interfaces de usuario rápidas e interactivas para aplicaciones web y móviles. Es una biblioteca de código abierto, basada en componentes, responsable únicamente de la capa de vista de la aplicación. En la arquitectura Modelo-Vista-Controlador (MVC), la capa de vista es responsable del aspecto y la sensación de la aplicación. React fue creado por Jordan Walke, un ingeniero de software de Facebook. &lt;/div&gt;
    &lt;/div&gt;
    &lt;hr&gt;
    &lt;div class="container"&gt;
      &lt;div class="etiqueta"&gt;¿Qué es PHP?&lt;/div&gt;
      &lt;div class="contenido"&gt;PHP es un lenguaje de scripting del lado del servidor y de propósito general que es especialmente adecuado para el desarrollo web. Originalmente, PHP significaba "Personal Home Page". Sin embargo, ahora significa Hypertext Preprocessor. Es un acrónimo recursivo porque la primera palabra también es un acrónimo.&lt;/div&gt;
    &lt;/div&gt;
    &lt;hr&gt;
    &lt;div class="contenedor"&gt;
      &lt;div class="etiqueta"&gt;¿Qué es Node JS?&lt;/div&gt;
      &lt;div class="contenido"&gt;Node.js es un entorno de ejecución de JavaScript de código abierto y multiplataforma que se ejecuta en el motor V8 y ejecuta código JavaScript fuera de un navegador web. Node.js permite a los desarrolladores utilizar JavaScript para escribir herramientas de línea de comandos y para la ejecución de scripts del lado del servidor para producir contenidos dinámicos de páginas web antes de que la página se envíe al navegador web del usuario. Por lo tanto, Node.js representa un paradigma de "JavaScript en todas partes".&lt;/div&gt;
    &lt;/div&gt;
    &lt;hr&gt;
  &lt;/div&gt;
  &lt;/div&gt;

  &lt;script src="app.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;/body&gt;
</code></pre><figcaption>Markup for Accordion Menu</figcaption></figure><p>Sin CSS, nuestra página se verá toda desnuda, así:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/02/image-33.png" class="kg-image" alt="image-33" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/02/image-33.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/02/image-33.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2022/02/image-33.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2022/02/image-33.png 1917w" sizes="(min-width: 720px) 720px" width="1917" height="900" loading="lazy"><figcaption>Cómo se ve el menú acordeón sin CSS</figcaption></figure><h3 id="c-mo-estilizar-el-acorde-n-con-css">Cómo estilizar el acordeón con CSS</h3><p>Queremos que nuestro menú acordeón se vea bien, por supuesto. Es hora de poner en juego algo de CSS. He añadido algunos comentarios en el código para explicar lo que hace cada pieza:</p><pre><code>@import url('https://fonts.googleapis.com/css2?family=Rubik:wght@300&amp;display=swap');

/* Establece el color de fondo del cuerpo en azul. Establece el tipo de letra a Rubik */

body {
  background-color: #0A2344;
  font-family: 'rubik', sans-serif;
}

/* Alinea el texto del encabezado al centro. */
 
h1 {
  text-align: center;
}

/* Establece el ancho del acordeón. Establece el margen a 90px en la parte superior e inferior y auto a la izquierda y derecha */

.acordeon {
  width: 800px;
  margin: 90px auto;
  color: black;
  background-color: white;
  padding: 45px 45px;
}
</code></pre><p>Con todos estos estilos aplicados, este es el aspecto que tendrá ahora nuestro acordeón:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/02/image-34.png" class="kg-image" alt="image-34" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/02/image-34.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/02/image-34.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2022/02/image-34.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2022/02/image-34.png 1919w" sizes="(min-width: 720px) 720px" width="1919" height="901" loading="lazy"><figcaption>Estilos añadidos al menú acordeón</figcaption></figure><p>Ahora tenemos que empezar a trabajar en el interior para configurar su funcionalidad. En primer lugar, establecemos la propiedad position de cada uno de los contenedores (que contienen tanto la etiqueta como el contenido) como relativa.</p><p>Esto significa que ahora podemos posicionar sus hijos en relación con él.</p><pre><code class="language-css">.acordeon .contenedor {
  position: relative;
  margin: 10px 10px;
}

/* Posiciona las etiquetas en relación con el contenedor. Añade relleno en la parte superior e inferior y aumenta el tamaño de la fuente. También hace que su cursor sea un puntero */

.acordeon .etiqueta {
  position: relative;
  padding: 10px 0;
  font-size: 30px;
  color: black;
  cursor: pointer;
}
</code></pre><p>Ahora puedes notar la diferencia en la imagen de abajo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/02/image-35.png" class="kg-image" alt="image-35" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/02/image-35.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/02/image-35.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2022/02/image-35.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2022/02/image-35.png 1919w" sizes="(min-width: 720px) 720px" width="1919" height="897" loading="lazy"></figure><p>La siguiente acción será añadir un pequeño signo "+" al final de cada lista. Esto permitirá a los usuarios saber que pueden ampliar la sección para aprender/ver más.</p><p>Para ello, utilizaremos el selector <code>::before.</code> El selector <code>::before</code> y <code>::after</code> se utiliza para colocar el contenido antes o después de un elemento especificado.</p><p>Aquí, estamos insertando '+' antes de la etiqueta. Pero utilizaremos las propiedades de desplazamiento <code>top</code> y <code>right</code> para colocarlo en la esquina derecha.</p><pre><code class="language-css">
/* Posiciona el signo más a 5px de la derecha. Lo centra utilizando la propiedad transform. */

.acordeon .etiqueta::before {
  content: '+';
  color: black;
  position: absolute;
  top: 50%;
  right: -5px;
  font-size: 30px;
  transform: translateY(-50%);
}

/* Oculta el contenido (altura: 0), disminuye el tamaño de la fuente, justifica el texto y añade la transición */

.acordeon .contenido {
  position: relative;
  background: white;
  height: 0;
  font-size: 20px;
  text-align: justify;
  width: 780px;
  overflow: hidden;
  transition: 0.5s;
}

/* Añade una línea horizontal entre los contenidos */

.acordeon hr {
  width: 100;
  margin-left: 0;
  border: 1px solid grey;
}
</code></pre><p>Esto hará que todo sea mejor. También observa que el contenido de cada lista está ahora oculto.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/02/image-36.png" class="kg-image" alt="image-36" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/02/image-36.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/02/image-36.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2022/02/image-36.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2022/02/image-36.png 1916w" sizes="(min-width: 720px) 720px" width="1916" height="900" loading="lazy"><figcaption>El contenido del menú acordeón está ahora oculto</figcaption></figure><h3 id="a-adir-javascript-a-nuestro-acorde-n">Añadir JavaScript a nuestro Acordeón</h3><p>En este punto, nuestro acordeón es bastante estático. Para hacer que el contenedor muestre el contenido cuando el usuario haga clic en él, necesitaremos introducir algo de JavaScript.</p><p>Navegue a su script <code>app.js</code> y escriba el siguiente código:</p><pre><code class="language-js">const acordeon = document.getElementsByClassName('contenedor');

for (i=0; i&lt;acordeon.length; i++) {
  acordeon[i].addEventListener('click', function () {
    this.classList.toggle('activa')
  })
}
</code></pre><p>Este script accederá a todas nuestras listas por <code>classname</code> del <code>contenedor</code>.</p><p>Luego haremos un bucle a través de la lista. Para cada contenedor, simplemente queremos registrar un oyente de eventos en él. Cuando se hace clic, queremos cambiar la clase "activa" en ese elemento.</p><p>Ahora vamos a probar este efecto. Haz clic en el primer contenedor con la etiqueta <code>¿Que es HTML?</code>, abre tus Herramientas de Desarrollador (haz clic en F12), e inspecciónalo dentro de la pestaña de elementos.</p><p>Deberías encontrar la clase <code>activa</code> registrada en él:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/02/image-39.png" class="kg-image" alt="image-39" width="396" height="407" loading="lazy"></figure><p>Si se vuelve a hacer clic en el elemento, se eliminará la clase <code>activa</code> del mismo.</p><h3 id="c-mo-finalizar-la-aplicaci-n">Cómo finalizar la aplicación</h3><p>Hay una última cosa que necesitamos hacer. Necesitamos crear una clase activa dentro de una hoja de estilos. Definiremos cómo queremos que se vea nuestro acordeón una vez que JavaScript active la clase en un contenedor.</p><pre><code class="language-css">
/* Muestra la parte de contenido cuando está activa. Establece la altura */

.acordeon .contenedor.activa .contenido {
  height: 150px;
}

/* Cambia de signo positivo a negativo una vez activado */

.acordeon .contenedor.activa .etiqueta::before {
  content: '-';
  font-size: 30px;
}
</code></pre><p>Así es como se ve y se comporta nuestra aplicación al final:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/02/Peek-2022-02-26-14-27.gif" class="kg-image" alt="Peek-2022-02-26-14-27" width="1213" height="831" loading="lazy"><figcaption>Aspecto final</figcaption></figure><h2 id="conclusi-n">Conclusión</h2><p>Así que en este tutorial, construimos un menú acordeón usando HTML, CSS y JavaScript.</p><p>Gracias por seguirnos. Espero que hayas aprendido algo útil de este tutorial.</p><p>Que tengas una buena semana.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de JavaScript Array.find(): Cómo iterar a través de los elementos de un arreglo ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por: Kingsley Ubah [https://www.freecodecamp.org/news/author/ubahthebuilder/] Artículo original: JavaScript Array.find() Tutorial – How to Iterate Through Elements in an Array [https://www.freecodecamp.org/news/javascript-array-find-tutorial-how-to-iterate-through-elements-in-an-array/] Traducido y adaptado por: Luis Ignacio Cabezas [/espanol/news/author/luisignaciocc/] Cuando trabajas con una colección de arreglos, a veces sólo necesitas saber si un elemento existe en ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-de-javascript-array-find-como-recorrer-los-elementos-de-una-matriz/</link>
                <guid isPermaLink="false">618f073431882c095864deeb</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ignacio Collantes ]]>
                </dc:creator>
                <pubDate>Mon, 10 Jan 2022 12:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/11/find-method-js.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original escrito por</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> </strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/author/ubahthebuilder/">Kingsley Ubah</a><br><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/javascript-array-find-tutorial-how-to-iterate-through-elements-in-an-array/">JavaScript Array.find() Tutorial – How to Iterate Through Elements in an Array</a><br><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> </strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/luisignaciocc/">Luis Ignacio Cabezas</a></p><p>Cuando trabajas con una colección de arreglos, a veces sólo necesitas saber si un elemento existe en el arreglo para poder extraerlo. Y no te importará saber cuántos otros elementos (si es que hay alguno) existen dentro del mismo arreglo.</p><p>Pues bien, podemos utilizar el método <code>find()</code> para hacer precisamente eso.</p><h2 id="c-mo-funciona-el-m-todo-array-find-">Cómo funciona el método Array.find()</h2><p>El método <code>find()</code> es un método de <code>Array.prototype</code> (también conocido como incorporado) que toma una función de callback y llama a esa función para cada elemento que recorre dentro del arreglo al que está vinculado.</p><p>Cuando encuentra una coincidencia (en otras palabras, la función callback devuelve <code>true</code>), el método devuelve ese elemento particular del arreglo e inmediatamente rompe el bucle. Así que el método <code>find()</code> devuelve el primer elemento dentro de un arreglo que satisface la función callback.</p><p>La función callback puede tomar los siguientes parámetros:</p><ul><li><code>currentItem</code>: Es el elemento del arreglo sobre el que se está iterando actualmente.</li><li><code>index</code>: Esta es la posición de índice de <code>currentItem</code> dentro del arreglo.</li><li><code>array</code>: Representa el arreglo de destino junto con todos sus elementos.</li></ul><h2 id="c-mo-utilizar-el-m-todo-find-en-javascript">Cómo utilizar el método find() en JavaScript</h2><p>En los siguientes ejemplos, demostraré cómo se puede utilizar el método <code>find()</code> para recuperar el primer elemento de una matriz que coincida con una condición especifica en JavaScript.</p><h3 id="c-mo-obtener-un-solo-elemento-con-find-">Cómo obtener un solo elemento con find()</h3><p>Supongamos que tienes un perro que se ha perdido. Lo denuncias a las autoridades competentes y estas reúnen a un grupo de perros recuperados.</p><p>Para poder encontrar a tu perro, necesitas proporcionar información única sobre él. Por ejemplo, la raza de su perro (un chihuahua) puede servir para identificarlo.</p><p>Podemos expresar este escenario en JavaScript utilizando una colección de arreglos. El arreglo llamado perrosEncontrados contendrá todos los nombres de los perros recuperados, así como sus respectivas razas. Y utilizaremos el método find() para encontrar el perro que es un chihuahua desde dentro del arreglo.</p><pre><code class="language-js">let perrosEncontrados = [{
    breed: "Beagle",
    color: "blanco"
  },

  {
    raza: "Chihuahua",
    color: "amarillo"
  },

  {
    breed: "Pug",
    color: "negro"
  },
]

function encuentraMiPerro(perro) {
  return perro.raza === "Chihuahua"
}

let miPerro = perrosEncontrados.find(perro =&gt; encuentraMiPerro(perro));

console.log(miPerro);


/*

{
  raza: "Chihuahua",
  color: "amarillo"
}

*/</code></pre><p>El método <code>find()</code> deja de iterar cuando se encuentra una coincidencia.</p><p>Hay algo muy importante que hay que recordar sobre <code>find()</code>: deja de ejecutarse una vez que la función callback devuelve una declaración como <code>true</code>.</p><p>Para ilustrar esto, utilizaremos de nuevo el ejemplo del perro perdido. Esta vez, supondremos que se han encontrado dos chihuahuas.</p><p>Pero el método <code>find()</code> sólo devolverá la primera instancia de Chihuahua que descubra dentro del arreglo. Cualquier otra instancia será ignorada posteriormente.</p><p>También podemos ver esto fácilmente registrando la posición del índice de ese elemento en la consola:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let perrosEncontrados = [{
    raza: "Beagle",
    color: "blanco"
  },

  {
    raza: "Chihuahua",
    color: "amarillo"
  },

  {
    raza: "Pug",
    color: "negro"
  },
  
  {
    raza: "Chihuahua",
    color: "amarillo"
  }
]


function encuentraMiPerro(perro, indice) {
  if (perro.raza === "Chihuahua") console.log(indice);
  return perro.raza === "Chihuahua"
}


let miPerro = encuentraPerros.find((perro, indice) =&gt; encuentraMiPerro(perro, indice));


console.log(miPerro);

/* 
1

{
  raza: "Chihuahua",
  color: "amarillo"
}

*/</code></pre><figcaption>Returns the first instance which has an index of 1</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/findreturns1.png" class="kg-image" alt="findreturns1" width="600" height="400" loading="lazy"></figure><h3 id="c-mo-utilizar-una-asignaci-n-de-desestructuraci-n">Cómo utilizar una asignación de desestructuración</h3><p>Puede hacer que su código sea más conciso combinando la asignación de desestructuración y una expresión de función de flecha.</p><p>Utilizaremos la desestructuración para extraer sólo la propiedad nombré del objeto que luego pasaremos como parámetro a la función callback.</p><p>Obtendremos el mismo resultado:</p><pre><code class="language-js">let perrosEncontrados = [
  {
    raza: "Beagle",
    color: "blanco"
  },

  {
    raza: "Chihuahua",
    color: "amarillo"
  },

  {
    raza: "Pug",
    color: "negro"
  },
]

 


let miPerro = perrosEncontrados.find(({raza}) =&gt; raza === "Chihuahua");

console.log(miPerro);

/*

{
  raza: "Chihuahua",
  color: "amarillo"
}

*/</code></pre><h3 id="c-mo-encontrar-un-elemento-por-su-ndice">Cómo encontrar un elemento por su índice</h3><p>En este ejemplo, encontraremos y devolveremos el punto perteneciente a 'David' desde dentro del arreglo utilizando su valor de índice único. Esto demuestra una de las formas en que podemos utilizar la propiedad <code>index</code> dentro de nuestra función <code>callback</code> con el método <code>find()</code>:</p><pre><code class="language-js">let posicionesReservadas = [{
    nombre: "Ana",
    edad: 24
  },

  {
    nombre: "Beth",
    edad: 22
  },

  {
    nombre: "Cara",
    edad: 25
  },
  
  {
    nombre: "David",
    edad: 30
  },
  
  {
    nombre: "Ethan",
    edad: 26
  }
]


function encontrarPorIndice(persona, indice) {
  return indice === 3
}


let miPosicion = posicionesReservadas.find((persona, indice) =&gt; encontrarPorIndice(persona, indice));

console.log(miPosicion);

/*
{
  edad: 30,
  nombre: "David"
}
*/</code></pre><h2 id="puede-utilizar-el-objeto-de-contexto-con-find-">Puede utilizar el objeto de contexto con find()</h2><p>Además de la función callback, el método <code>find()</code> también puede tomar un objeto de contexto.</p><pre><code class="language-js">find(callback, objetoContexto)</code></pre><p>Podemos entonces referirnos a este objeto desde dentro de la función <strong>callback</strong> en cada iteración, utilizando la palabra clave <code>this</code> como referencia. Esto nos permite acceder a cualquier propiedad o método definido dentro del objeto de contexto.</p><h3 id="c-mo-utilizar-el-objeto-de-contexto-con-find-">Cómo utilizar el objeto de contexto con find()</h3><p>Digamos que tenemos una matriz de solicitudes de empleo y queremos seleccionar sólo el primer solicitante que cumpla todos los criterios.</p><p>Todos los criterios se definen dentro de un objeto de contexto llamado <code>criterios</code> y ese objeto se pasa posteriormente como segundo parámetro al método <code>find()</code>. Luego, desde la función callback, accedemos al objeto para comprobar si un candidato cumple con todos los criterios allí especificados.</p><pre><code class="language-js">let candidatos = [
    {nombre: "aaron", añosDeExperiencia: 18, edad: 66},
    {nombre: "beth", añosDeExperiencia:  0, edad: 18},
    {nombre: "cara", añosDeExperiencia: 4, edad: 22},
    {nombre: "daniel", añosDeExperiencia: 3, edad: 16},
    {nombre: "ella", añosDeExperiencia: 5, edad: 25},
    {nombre: "fin", añosDeExperiencia: 0, edad: 16},
    {nombre: "george", añosDeExperiencia: 6, edad: 28},
]

let criterios = {
  experienciaMinima: 3,
  edadMinima: 18,
  edadMaxima: 65
}

   
let candidatoSuertudo = candidatos.find(function(candidato) {
	return candidato.añosDeExperiencia &gt;= this.experienciaMinima &amp;&amp; candidato.edad &lt;= this.edadMaxima &amp;&amp; candidato.edad &gt;= this.edadMinima ;
}, criterios)

console.log(candidatoSuertudo);

/*
{
  edad: 22,
  nombre: "cara",
  añosDeExperiencia: 4
}
*/</code></pre><p>Técnicamente, los tres candidatos (Cara, Ella y George) cumplen los criterios. Es decir, los tres tienen al menos 18 años, no son mayores de 65 y tienen al menos 3 años de experiencia laboral.</p><p>Sin embargo, como el método <code>find()</code> siempre devuelve SOLO la primera instancia que se evalúa como verdadera, las otras dos serán ignoradas y el bucle se romperá.</p><h2 id="en-conclusi-n"><strong>En conclusión</strong></h2><p>El método <code>find()</code> es un método de <code>Array.prototype</code> que toma una función de callback y llama a esa función para cada elemento dentro del arreglo delimitado.</p><p>Cuando la función callback se evalúa como <code>true</code>, el método devuelve el elemento actual y rompe el bucle. Devuelve sólo la primera coincidencia - cualquier otra coincidencia presente dentro de la matriz será ignorada.</p><p>En adición de la función callback, el método <code>find()</code> también puede tomar un objeto de contexto como segundo argumento. Esto te permitirá acceder a cualquiera de sus propiedades desde la función callback usando <code>this</code>.</p><p>Espero que este artículo te haya sido utilidad.</p><p><strong>Si quieres aprender más sobre Desarrollo Web, no dudes en visitar mi <a href="https://ubahthebuilder.tech/the-ultimate-tutorial-on-javascript-dom-js-dom-with-examples">blog.</a></strong></p><p>Gracias por leer y hasta pronto.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Operadores Rest y Spread de JavaScript: ¿Cuál es la diferencia? ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Oluwatobi Sofela [https://www.freecodecamp.org/news/author/oluwatobiss/] Artículo original JavaScript Rest vs Spread Operator – What’s the Difference? [https://www.freecodecamp.org/news/javascript-rest-vs-spread-operators/] Traducido y adaptado por Luis Ignacio Cabezas [/espanol/news/author/luisignaciocc/] JavaScript usa tres puntos (...) para ambos operadores, rest y spread. Pero estos dos operadores no son iguales. La principal diferencia entre rest ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/operadores-rest-spread-de-javascript-cual-es-la-diferencia/</link>
                <guid isPermaLink="false">616d5bb85658740999352c05</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ignacio Collantes ]]>
                </dc:creator>
                <pubDate>Wed, 10 Nov 2021 12:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/10/javascript-rest-vs-spread-operators-codesweetly-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original escrito por </strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/author/oluwatobiss/">Oluwatobi Sofela</a><br><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original </strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/javascript-rest-vs-spread-operators/">JavaScript Rest vs Spread Operator – What’s the Difference?<br></a><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por </strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/luisignaciocc/">Luis Ignacio Cabezas</a></p><p>JavaScript usa tres puntos (<code>...</code>) para ambos operadores, rest y spread. Pero estos dos operadores no son iguales.</p><p>La principal diferencia entre rest y spread es que el operador rest organiza el resto de algunos valores específicos suministrados por el usuario en un arreglo de JavaScript. Por otro lado la sintaxis spread expande los iterables en elementos individuales.</p><p>Por ejemplo, considere este código que utiliza rest para encerrar algunos valores en un arreglo:</p><pre><code class="language-js">// Usa rest para encerrar el resto de valores específicos proporcionados por el usuario en un arreglo:
function miBio(primerNombre, apellido, ...otraInfo) { 
  return otraInfo;
}

// Invoca la función miBio pasando cinco argumentos a sus parámetros:
miBio("Oluwatobi", "Sofela", "CodeSweetly", "Desarrollo Web", "Hombre");

// La invocación anterior devolverá:
["CodeSweetly", "Desarrollo Web", "Hombre"]</code></pre><p>En el fragmento anterior, utilizamos el parámetro rest <code>...otraInfo</code> para colocar <code>"CodeSweetly"</code>, <code>"Desarrollo Web"</code>, y <code>"Hombre"</code> en un arreglo.</p><p>Ahora, considere este ejemplo de un operador spread:</p><pre><code class="language-js">// Define una función con tres parámetros:
function miBio(primerNombre, apellido, empresa) { 
  return `${primerNombre} ${apellido} dirije ${empresa}`;
}

// Utiliza spread para expandir los elementos de un arreglo en argumentos individuales:
miBio(...["Oluwatobi", "Sofela", "CodeSweetly"]);

// La invocación anterior devolverá:
“Oluwatobi Sofela dirije CodeSweetly”</code></pre><p><strong><a href="https://stackblitz.com/edit/web-platform-ppjslx?file=script.js">Pruebalo en<strong> StackBlitz</strong></a></strong></p><p>En el fragmento anterior, usamos el operador spread (<code>...</code>) para distribuir el contenido de <code>["Oluwatobi", "Sofela", "CodeSweetly"]</code> entre los parámetros de <code>miBio()</code>.</p><p>No te preocupes si aún no entiendes como funcionan los operadores rest y spread. ¡Este artículo te tiene cubierto!</p><p>En las siguientes secciones, discutiremos cómo funcionan rest y spread en JavaScript.</p><p>Así que, sin más preámbulos, empecemos con el operador rest.</p><h2 id="-qu-es-exactamente-el-operador-rest"><strong>¿</strong>Qué<strong> es exactamente el operador Rest?</strong></h2><p>El operador rest se utiliza para poner el resto de algunos valores específicos suministrados por el usuario en un arreglo de JavaScript.</p><p>Así, por ejemplo, esta es la sintaxis de rest:</p><pre><code class="language-js">...tusValores</code></pre><p>Los tres puntos (<code>...</code>) en el fragmento anterior simbolizan el operador rest.</p><p>El texto que aparece después del operador rest hace referencia a los valores que desea incluir en un arreglo. Sólo se puede utilizar antes del último parámetro en la definición de una función.</p><p>Para entender mejor la sintaxis, veamos cómo funciona el operador rest con las funciones de JavaScript.</p><h3 id="-c-mo-funciona-el-operador-rest-en-una-funci-n"><strong>¿Cómo funciona el operador Rest en una función?</strong></h3><p>En las funciones de JavaScript, rest se utiliza como prefijo del último parámetro de la función.</p><p><strong><strong>He</strong> aquí un ejemplo<strong>:</strong></strong></p><pre><code class="language-js">// Defina una función con dos parámetros regulares y un parámetro rest:
function miBio(primerNombre, apellido, ...otraInfo) { 
  return otraInfo;
}</code></pre><p>El operador rest (<code>...</code>) ordena al ordenador que añada cualquier argumento (<code>otraInfo</code>) suministrado por el usuario en un arreglo. Luego, lo asigna al parámetro <code>otraInfo</code>.</p><p>Como tal, llamamos a <code>...otraInfo</code> un parámetro rest.</p><p><strong><strong>Not</strong>a<strong>: </strong></strong><a href="https://www.codesweetly.com/javascript-arguments">Los argumentos</a> son valores opcionales que puedes pasar al parámetro de una función a través de un invocador.</p><p><strong>Aquí hay otro ejemplo<strong>:</strong></strong></p><pre><code class="language-js">// Define una función con dos parámetros regulares y un parámetro rest:
function miBio(primerNombre, apellido, ...otraInfo) { 
  return otraInfo;
}

// Invoca la función miBio pasando cinco argumentos a sus parámetros:
miBio("Oluwatobi", "Sofela", "CodeSweetly", "Desarrollo Web", "Hombre");

// La invocación anterior devolverá:
["CodeSweetly", "Desarrollo Web", "Hombre"]</code></pre><p>En el fragmento anterior, observa que la invocación de <code>miBio</code> pasó cinco argumentos a la función.</p><p>Es decir, <code>"Oluwatobi"</code> y <code>"Sofela"</code> se asignaron a los parámetros <code>primerNombre</code> y <code>apellido</code>.</p><p>Al mismo tiempo, el operador rest añadió los argumentos restantes ( <code>"CodeSweetly"</code>, <code>"Desarrollo Web"</code>, y <code>"Hombre"</code>) en un arreglo y asignó ese arreglo al parámetro <code>otraInfo</code>.</p><p>Por lo tanto, la función <code>miBio()</code> devolvió correctamente <code>["CodeSweetly", "Desarrollo Web", "Hombre"]</code>como contenido del parámetro <code>otraInfo</code>.</p><h3 id="-cuidado-no-puedes-utilizar-use-strict-dentro-de-una-funci-n-que-contenga-un-par-metro-rest"><strong>¡Cuidado! No puedes utilizar <code>“use strict”</code> dentro de una función que contenga un parámetro rest</strong></h3><p>Ten en cuenta que no puedes utilizar la directiva <code>“use strict”</code> dentro de ninguna función que contenga un parámetro rest, un parámetro por defecto o un parámetro de desestructuración. Si lo haces, el ordenador arrojará un <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Errors/Strict_Non_Simple_Params">error de sintaxis.</a></p><p>Por ejemplo, considere el siguiente ejemplo:</p><pre><code class="language-js">// Define una función con un parámetro rest:
function muestraMiNombre(..valor) {
  "use strict";
  return valor;
}

// La definición anterior devolverá:
"Uncaught SyntaxError: Illegal 'use strict' directive in function with non-simple parameter list"</code></pre><p><code>muestraMiNombre()</code> devuelve un error de sintaxis porque hemos utilizado la directiva <code>“use strict”</code> dentro de una función con un parámetro rest.</p><p>Pero supón que necesitas que tu función esté en modo estricto y al mismo tiempo utilizas el parámetro rest. En tal caso, puedes escribir la directiva <code>“use strict”</code> fuera de la función.</p><p><strong><strong>He</strong> aquí un ejemplo<strong>:</strong></strong></p><pre><code class="language-js">// Define una directiva "use strict" fuera de su función:
"use strict";

// Define una función con un parámetro rest:
function imprimirMiNombre(...value) {
  return value;
}

// Invoca la función imprimirMiNombre pasando dos argumentos a sus parámetros:
imprimirMiNombre("Oluwatobi", "Sofela");

// La invocación de arriba devolverá:
["Oluwatobi", "Sofela"]</code></pre><p><strong><strong>Not</strong>a<strong>: </strong></strong>Sólo coloca la directiva <code>“use strict”</code> fuera de su función si está bien que todo el script o el ámbito que lo encierra esté en modo estricto.</p><p>Así que ahora que sabemos cómo funciona rest en una función, podemos hablar de cómo funciona en una asignación de desestructuración.</p><h3 id="c-mo-funciona-el-operador-rest-en-una-asignaci-n-de-desestructuraci-n"><strong>Cómo funciona el operador rest </strong>en una asignación de desestructuración</h3><p>El operador rest se utiliza normalmente como prefijo de la última variable de la asignación de desestructuración.</p><p><strong>Este es un ejemplo<strong>:</strong></strong></p><pre><code class="language-js">// Define un arreglo desestructurado con dos variables regulares y una variable rest:
const [primerNombre, apellido, ...otraInfo] = [
  "Oluwatobi", "Sofela", "CodeSweetly", "Desarrollo Web", "Hombre"
];

// Invoca la variable otraInfo:
console.log(otraInfo); 

// La invocación anterior devolverá:
["CodeSweetly", "Desarrollo Web", "Hombre"]</code></pre><p>El operador rest (<code>...</code>) indica a la computadora que añada el resto de los valores proporcionados por el usuario en un arreglo. Luego, asigna ese arreglo a la variable <code>otraInfo</code>.</p><p>Como tal, puedes llamar a <code>...otraInfo</code> una variable rest.</p><p><strong>Aquí hay otro ejemplo<strong>:</strong></strong></p><pre><code class="language-js">// Define un objeto de desestructuración con dos variables regulares y una variable rest:
const { primerNombre, apellido, ...otraInfo } = {
  primerNombre: "Oluwatobi",
  apellido: "Sofela", 
  nombreEmpresa: "CodeSweetly",
  profesion: "Desarrollo Web",
  genero: "Hombre"
}

// Invoca la variable otraInfo:
console.log(otraInfo);

// La invocación anterior devolverá:
{nombreEmpresa: "CodeSweetly", profesion: "Desarrollo Web", genero: "Hombre"}</code></pre><p>En el fragmento anterior, observe que el operador rest asignó un objeto de propiedades - no un arreglo - a la variable <code>otraInfo</code>.</p><p>En otras palabras, siempre que utilice rest en un &nbsp; objeto desestructurado, el operador rest producirá un objeto de propiedades.</p><p>Sin embargo, si se utiliza rest en un arreglo desestructurado o en una función, el operador producirá un arreglo.</p><p>Antes de terminar nuestra discusión sobre rest, deberías ser consciente de algunas diferencias entre los argumentos de JavaScript y el parámetro rest. Por lo tanto, vamos a hablar de eso a continuación.</p><h3 id="argumentos-vs-par-metros-rest-cu-l-es-la-diferencia"><strong>Argumentos vs Parámetros rest: ¿Cuál es la diferencia?</strong></h3><p>Estas son algunas de las diferencias entre los argumentos de JavaScript y el parámetro rest:</p><h4 id="diferencia-1-el-objeto-argumentos-es-un-objeto-tipo-arreglo-no-un-arreglo-real-"><strong>Diferencia 1: El objeto <code>argumentos</code> es un objeto tipo arreglo — ¡no un arreglo real!</strong></h4><p>Tenga en cuenta que el objeto argumentos de JavaScript no es un arreglo real. En su lugar, es un objeto similar a un arreglo que no tiene las características completas de un arreglo normal de JavaScript.</p><p>El parámetro rest, sin embargo, es un arreglo real. Como tal, puedes utilizar todos los métodos de arreglos en él.</p><p>Así, por ejemplo, puedes llamar a los métodos <code>sort()</code>, <code>map()</code>, <code>forEach()</code>, o <code>pop()</code> en un parámetro rest. Pero no puedes hacer lo mismo con el objeto argumentos.</p><h4 id="diferencia-2-no-se-puede-utilizar-el-objeto-argumentos-en-una-funci-n-de-flecha"><strong>Diferencia 2: </strong>No se puede utilizar el objeto<strong> <code>argumentos</code> </strong>en una función de flecha</h4><p>El objeto <code>argumentos</code> no está disponible dentro de una función de flecha, por lo que no se puede utilizar allí. Pero puedes usar el parámetro rest dentro de todas las funciones - incluyendo la función flecha.</p><h4 id="diferencia-3-deja-que-rest-sea-tu-preferencia"><strong>Diferencia 3: </strong>Deja que rest sea tu preferencia</h4><p>Es mejor utilizar los parámetros rest en lugar del objeto <code>argumentos</code> especialmente cuando se escribe código compatible con ES6.</p><p>Ahora que sabemos cómo funciona rest, vamos a discutir el operador <code>spread</code> para que podamos ver las diferencias.</p><h2 id="-qu-es-el-operador-spread-y-c-mo-funciona-spread-en-javascript"><strong>¿Qué es el operador Spread y cómo funciona <code>spread</code> en JavaScript?</strong></h2><p>El <strong>operador spread</strong> (<code>...</code>) le ayuda a expandir los iterables en elementos individuales.</p><p>La sintaxis de spread funciona dentro de los literales de los arreglos, las llamadas a funciones y los objetos de propiedad inicializados para extender los valores de los objetos iterables en elementos separados. Así que, efectivamente, hace lo contrario que el operador rest.</p><p><strong><strong>Not</strong>a<strong>: </strong></strong>Un operador spread es efectivo sólo cuando se usa dentro de literales de arreglo, llamadas a funciones u objetos de propiedades inicializadas.</p><p>Entonces, ¿qué significa exactamente esto? Veámoslo con algunos ejemplos.</p><h3 id="ejemplo-de-spread-1-c-mo-funciona-spread-en-un-arreglo"><strong>Ejemplo de Spread 1: Cómo funciona Spread en un arreglo</strong></h3><pre><code class="language-js">const miNombre = ["Sofela", "es", "mi"];
const sobreMi = ["Oluwatobi", ...miNombre, "nombre."];

console.log(sobreMi);

// La invocación anterior devolverá:
[ "Oluwatobi", "Sofela", "es", "mi", "nombre." ]</code></pre><p>El fragmento anterior utilizó la extensión (<code>...</code>) para copiar el arreglo <code>miNombre</code> en <code>sobreMi</code>.</p><p><strong><strong>Not</strong>a<strong>:</strong></strong></p><ul><li>Las alteraciones de <code>miNombre</code> no se reflejarán en <code>sobreMi</code> porque todos los valores dentro de <code>miNombre</code> son primitivos. Por lo tanto, el operador spread simplemente copió y pegó el contenido de <code>miNombre</code> en <code>sobreMi</code> sin crear ninguna referencia al arreglo original.</li><li><a href="https://dev.to/oluwatobiss/spread-operator-how-spread-works-in-javascript-4fdn#comment-node-767546"></a><a href="https://dev.to/oluwatobiss/spread-operator-how-spread-works-in-javascript-4fdn">E</a>l operador spread sólo hace una copia superficial. Así que, ten en cuenta que suponiendo que <code>miNombre</code> contuviera cualquier valor no primitivo, el ordenador habría creado una referencia entre <code>miNombre</code> y <code>sobreMi</code>.</li><li>Supongamos que no utilizamos la sintaxis de propagación para duplicar el contenido de <code>miNombre</code>. Por ejemplo, si hubiéramos escrito <code>const sobreMi = ["Oluwatobi", miNombre, "nombre"]</code>. En tal caso, el ordenador habría asignado una referencia a <code>miNombre</code>. Así, cualquier cambio realizado en el arreglo original se reflejaría en el duplicado.</li></ul><h3 id="ejemplo-de-spread-2-c-mo-utilizar-spread-para-convertir-una-cadena-en-elementos-individuales-de-un-arreglo"><strong>Ejemplo de Spread 2: </strong>Cómo utilizar Spread para convertir una cadena en elementos individuales de un arreglo</h3><pre><code class="language-js">const miNombre = "Oluwatobi Sofela";

console.log([...miNombre]);

// La invocación anterior devolverá:
[ "O", "l", "u", "w", "a", "t", "o", "b", "i", " ", "S", "o", "f", "e", "l", "a" ]</code></pre><p>En el fragmento anterior, hemos utilizado la sintaxis de propagación (<code>...</code>) dentro de un arreglo (<code>[...]</code>) para expandir el valor de la cadena de <code>miNombre</code> en elementos individuales.</p><p>Así, <code>"Oluwatobi Sofela"</code> se expandió en <code>[ "O", "l", "u", "w", "a", "t", "o", "b", "i", " ", "S", "o", "f", "e", "l", "a" ]</code>.</p><h3 id="ejemplo-de-spread-3-c-mo-funciona-el-operador-spread-en-una-llamada-a-una-funci-n"><strong>Ejemplo de Spread 3: </strong>Cómo funciona el operador Spread en una llamada a una función</h3><pre><code class="language-js">const numeros = [1, 3, 5, 7];

function añadirNumeros(a, b, c, d) {
  return a + b + c + d;
}

console.log(añadirNumeros(...numeros));

// La invocación anterior devolverá:
16</code></pre><p>En el fragmento anterior, hemos utilizado la sintaxis spread para repartir el contenido del arreglo de <code>numeros</code> entre los parámetros de <code>añadirNumeros()</code>.</p><p>Supongamos que el arreglo de <code>numeros</code> tiene más de cuatro elementos. En tal caso, el ordenador sólo utilizará los cuatro primeros elementos como argumento de <code>añadirNumeros()</code> e ignorará el resto.</p><p><strong>He aquí un ejemplo:</strong></p><pre><code class="language-js">const numeros = [1, 3, 5, 7, 10, 200, 90, 59];

function añadirNumeros(a, b, c, d) {
  return a + b + c + d;
}

console.log(añadirNumeros(...numeros));

// La invocación anterior devolverá:
16</code></pre><p><strong>Aquí hay otro ejemplo:</strong></p><pre><code class="language-js">const miNombre = "Oluwatobi Sofela";

function deletreaNombre(a, b, c) {
  return a + b + c;
}

console.log(deletreaNombre(...miNombre));      // devuelve: "Olu"

console.log(deletreaNombre(...miNombre[3]));   // devuelve: "wundefinedundefined"

console.log(deletreaNombre([...miNombre]));    // devuelve: "O,l,u,w,a,t,o,b,i, ,S,o,f,e,l,aundefinedundefined"

console.log(deletreaNombre({...miNombre}));    // devuelve: "[object Object]undefinedundefined"</code></pre><p><strong>Ejemplo de Spread 4: Como funciona Spread en un objeto</strong></p><pre><code class="language-js">const misNombres = ["Oluwatobi", "Sofela"];
const bio = { ...misNombres, administra: "codesweetly.com" };

console.log(bio);

// La invocación anterior devolverá:
{ 0: "Oluwatobi", 1: "Sofela", administra: "codesweetly.com" }</code></pre><p>En el fragmento anterior, hemos utilizado spread dentro del objeto <code>bio</code> para expandir los valores de <code>miNombre</code> en propiedades individuales.</p><h3 id="lo-que-hay-que-saber-sobre-el-operador-spread"><strong>Lo que hay que saber sobre el operador Spread</strong></h3><p>Ten en cuenta estos tres datos esenciales siempre que decidas utilizar el operador spread.</p><h4 id="informaci-n-1-los-operadores-spread-no-pueden-expandir-los-valores-de-los-objetos"><strong>Información 1: </strong>Los operadores Spread no pueden expandir los valores de los objetos</h4><p>Dado que un objeto no es un objeto iterable, no puedes utilizar el operador spread para expandir sus valores.</p><p>Sin embargo, puedes utilizar el operador spread para clonar propiedades de un objeto a otro.</p><p><strong>He aquí un ejemplo:</strong></p><pre><code class="language-js">const miNombre = { primerNombre: "Oluwatobi", apellido: "Sofela" };
const bio = { ...miNombre, sitioWeb: "codesweetly.com" };

console.log(bio);

// La invocación anterior devolverá:
{ primerNombre: "Oluwatobi", apellido: "Sofela", sitioWeb: "codesweetly.com" };</code></pre><p>El fragmento anterior utiliza el operador spread para clonar el contenido de <code>miNombre</code> en el objeto <code>bio</code>.</p><p><strong><strong>Not</strong>a<strong>:</strong></strong></p><ul><li>El operador spread sólo puede expandir los valores de los objetos iterables.</li><li>Un objeto es iterable sólo si él (o cualquier objeto en su cadena de prototipos) tiene una propiedad con una clave <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterable_protocol">@@iterador.</a></li><li><a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/@@iterator">Array</a>, <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/@@iterator">TypedArray</a>, <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/String/@@iterator">String</a>, <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Map/@@iterator">Map</a> y <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Set/@@iterator">Set</a> son todos tipos iterables incorporados porque tienen la propiedad <code>@@iterator</code> por defecto.</li><li>Un objeto con propiedades no es un tipo de datos iterable porque no tiene la propiedad <code>@@iterator</code> por defecto.</li><li>Puedes hacer que un objeto con propiedades sea iterable añadiéndole <code>@@iterator</code>.</li></ul><h4 id="informaci-n-2-el-operador-spread-no-clona-propiedades-id-nticas">Información 2: El operador spread no clona propiedades idénticas</h4><p>Supongamos que utilizas el operador spread para clonar propiedades del objeto A en el objeto B. Y supongamos que el objeto B contiene propiedades idénticas a las del objeto A. En tal caso, las versiones de B sustituirán a las de A.</p><p><strong>He aquí un ejemplo:</strong></p><pre><code class="language-js">const myNombre = { primerNombre: "Tobi", apellido: "Sofela" };
const bio = { ...miNombre, primerNombre: "Oluwatobi", sitioWeb: "codesweetly.com" };

console.log(bio);

// La invocación anterior devolverá:
{ primerNombre: "Oluwatobi", apellido: "Sofela", sitioWeb: "codesweetly.com" };</code></pre><p>Observa que el operador spread no copió la propiedad <code>primerNombre</code> de <code>miNombre</code> en el objeto bio porque <code>bio</code> ya contiene una propiedad <code>primerNombre</code>.</p><h4 id="informaci-n-3-cuidado-con-el-funcionamiento-de-spread-cuando-se-utiliza-en-objetos-que-contienen-no-primitivos-">Información 3: ¡Cuidado con el funcionamiento de spread cuando se utiliza en objetos que contienen no primitivos!</h4><p>Supón que utilizas el operador spread en un objeto (o arreglo) que contiene sólo valores primitivos. El ordenador no creará ninguna referencia entre el objeto original y el duplicado.</p><p>Por ejemplo, considere este código de abajo:</p><pre><code class="language-js">const miNombre = ["Sofela", "es", "mi"];
const sobreMi = ["Oluwatobi", ...miNombre, "nombre."];

console.log(sobreMi);

// La invocación anterior devolverá:
["Oluwatobi", "Sofela", "es", "mi", "nombre."]</code></pre><p>Observa que cada elemento de <code>miNombre</code> es un valor primitivo. Por lo tanto, cuando usamos el operador de propagación para clonar <code>miNombre</code> en <code>sobreMi</code>, el ordenador no creó ninguna referencia entre los dos arreglos.</p><p>Como tal, cualquier alteración que hagas a <code>miNombre</code> no se reflejará en <code>sobreMi</code>, y viceversa.</p><p>Como ejemplo, vamos a añadir más contenido a <code>miNombre</code>:</p><pre><code class="language-js">miNombre.push("verdadero");</code></pre><p>Ahora, vamos a comprobar el estado actual de <code>miNombre</code> y de <code>sobreMi</code>:</p><pre><code class="language-js">console.log(myNombre); // ["Sofela", "es", "mi", "verdadero"]

console.log(sobreMi); // ["Oluwatobi", "Sofela", "es", "mi", "nombre."]</code></pre><p>Observa que el contenido actualizado de <code>miNombre</code> no se refleja en <code>sobreMi</code> - porque spread no creó ninguna referencia entre el arreglo original y el duplicado.</p><h5 id="-qu-pasa-si-minombre-contiene-elementos-no-primitivos">¿Qué pasa si miNombre contiene elementos no primitivos?</h5><p>Supongamos que <code>miNombre</code> contiene elementos no primitivos. En ese caso, spread creará una referencia entre el no primitivo original y el clonado.</p><p><strong>He aquí un ejemplo:</strong></p><pre><code class="language-js">const miNombre = [["Sofela", "es", "mi"]];
const sobreMi = ["Oluwatobi", ...miNombre, "nombre."];

console.log(sobreMi);

// La invocación anterior devolverá:
[ "Oluwatobi", ["Sofela", "es", "mi"], "nombre." ]</code></pre><p>Observa que <code>miNombre</code> contiene un valor no primitivo.</p><p>Por lo tanto, el uso del operador spread para clonar el contenido de <code>miNombre</code> en <code>sobreMi</code> hizo que el ordenador creara una referencia entre los dos arreglos.</p><p>Como tal, cualquier alteración que hagas a la copia de <code>miNombre</code> se reflejará en la versión de <code>sobreMi</code>, y viceversa.</p><p>Como ejemplo, vamos a añadir más contenido a <code>miNombre</code>:</p><pre><code class="language-js">miNombre[0].push("verdadero");</code></pre><p>Ahora, comprobemos el estado actual de <code>miNombre</code> y de <code>sobreMi</code>:</p><pre><code class="language-js">console.log(miNombre); // [["Sofela", "es", "mi", "verdadero"]]

console.log(sobreMi); // ["Oluwatobi", ["Sofela", "es", "mi", "verdadero"], "nombre."]</code></pre><p>Observa que el contenido actualizado de <code>miNombre</code> se refleja en <code>sobreMi</code> - porque spread creó una referencia entre el arreglo original y el duplicado.</p><p><strong>Aquí hay otro ejemplo:</strong></p><pre><code class="language-js">const miNombre = { primerNombre: "Oluwatobi", apellido: "Sofela" };
const bio = { ...miNombre };

miNombre.primerNombre = "Tobi";

console.log(miNombre); // { primerNombre: "Tobi", apellido: "Sofela" }

console.log(bio); // { primerNombre: "Oluwatobi", apellido: "Sofela" }</code></pre><p>En el fragmento anterior, la actualización de <code>miNombre</code> no se reflejó en <code>bio</code> porque utilizamos el operador de propagación en un objeto que contiene sólo valores primitivos.</p><p><strong>Nota:</strong> Un desarrollador llamaría a <code>miNombre</code> un <strong>objeto superficial</strong> porque sólo contiene elementos primitivos.</p><p><strong>Aquí hay un ejemplo más:</strong></p><pre><code class="language-js">const miNombre = { 
  primerNombre: { primerNombre: "Oluwatobi", apellido: "Sofela" }
};

const bio = { ...miNombre };

miNombre.nombreCompleto.primerNombre = "Tobi";

console.log(miNombre); // { nombreCompleto: { primerNombre: "Tobi", apellido: "Sofela" } }

console.log(bio); // { NombreCompleto: { primerNombre: "Tobi", apellido: "Sofela" } }</code></pre><p>En el fragmento anterior, la actualización de <code>miNombre</code> se refleja en <code>bio</code> porque hemos utilizado el operador spread en un objeto que contiene un valor no primitivo.</p><p><strong>Nota:</strong></p><ul><li>Llamamos a <code>miNombre</code> un <strong>objeto profundo</strong> porque contiene un elemento no primitivo.</li><li>La <strong>copia superficial</strong> se realiza cuando se crean referencias al clonar un objeto en otro. Por ejemplo, <code>...miNombre</code> produce una copia superficial del objeto <code>miNombre</code> porque cualquier alteración que hagas en uno se reflejará en el otro.</li><li>La <strong>copia profunda</strong> se realiza cuando se clonan objetos sin crear referencias. Por ejemplo, podría copiar profundamente <code>miNombre</code> en <code>bio</code> haciendo <code>const bio = JSON.parse(JSON.stringify(miNombre))</code>. Haciendo esto, el ordenador clonará <code>miNombre</code> en <code>bio</code> sin crear ninguna referencia.</li><li>Puedes romper la referencia entre los dos objetos reemplazando el objeto <code>nombreCompleto</code> dentro de <code>miNombre</code> o <code>bio</code> con un nuevo objeto. Por ejemplo, haciendo <code>miNombre.nombreCompleto = { primerNombre: "Tobi", apellido: "Sofela" }</code> desconectaría el puntero entre <code>miNombre</code> y <code>bio</code>.</li></ul><h2 id="para-terminar">Para terminar</h2><p>En este artículo se han tratado las diferencias entre los operadores rest y spread. También hemos utilizado ejemplos para ver cómo funciona cada operador.</p><p>¡Gracias por leer!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo usar Python y Pandas para organizar las grandes tormentas, el pesimismo y los datos duros. ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por David Clinton [https://www.freecodecamp.org/news/author/david/] Artículo original How to Use Python and Pandas to Map Major Storms, Pessimism, and Hard Data [https://www.freecodecamp.org/news/python-pandas-major-storms-hard-data/] Traducido y adaptado por Luis Ignacio Cabezas [https://luisignacio.cc/] A veces puede ser reconfortante, de algún modo, reflexionar sobre lo mucho peor que está todo ahora, de ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-usar-python-y-pandas-para-mapear-las-grandes-tormentas-el-pesimismo-y-los-datos-duros/</link>
                <guid isPermaLink="false">6161a4f7818d3e09126990c7</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ignacio Collantes ]]>
                </dc:creator>
                <pubDate>Tue, 19 Oct 2021 12:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/10/thunderstorm-98541_640.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original escrito por </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/author/david/">David Clinton</a><br><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/python-pandas-major-storms-hard-data/">How to Use Python and Pandas to Map Major Storms, Pessimism, and Hard Data</a><br><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por </strong></strong></strong></strong></strong></strong></strong></strong><a href="https://luisignacio.cc/">Luis Ignacio Cabezas</a></p><p>A veces puede ser reconfortante, de algún modo, reflexionar sobre lo mucho peor que está todo ahora, de lo que solía estar en los viejos tiempos.</p><p>"Los niños no respetan."</p><p>"Todo es demasiado caro."</p><p>"Los funcionarios públicos no inspiran confianza."</p><p>"¿Y qué pasa con el clima? <em>Nunca habíamos tenido tantos huracanes devastadores</em>, ¿O sí?"</p><p>Bueno, soy lo suficientemente mayor como para haber dado unas cuantas vueltas a la manzana y no estoy seguro. De niño no era precisamente angelical, las cosas siempre costaban más de lo que queríamos y los funcionarios públicos nunca fueron las criaturas más queridas del planeta. ¿Pero las grandes tormentas? No tengo ni idea.</p><p>Resulta que hay muchos datos excelentes sobre tormentas, así que no hay razón para no buscar al menos algunas pistas. Y mis intentos de añadir la analítica de datos a mi actual stock de herramientas profesionales podrían ayudar, aquí.</p><p>Sin embargo, primero debemos definir cuidadosamente algunos términos y antecedentes.</p><h2 id="-qu-es-una-gran-tormenta"><strong>¿Qué es una gran tormenta<strong>?</strong></strong></h2><p>Huracanes - o, más precisamente, ciclones tropicales - son "tropicales" en el sentido de que se forman sobre oceanos en regiones tropicales. El término "tropicales" se refiere al área de la superficie terrestre que se encuentra dentro de los 23 grados (más o menos) del ecuador, tanto al norte como al sur.</p><p>Las tormentas se llaman "ciclones" porque el movimiento de sus vientos es cíclico (en el sentido de las agujas del reloj en el hemisferio sur y en sentido contrario en el hemisferio norte).</p><p>Los ciclones se alimentan del agua oceánica evaporada y dejan a su paso tormentas torrenciales y a menudo violentas, sobre todo después de pasar por zonas terrestres habitadas.</p><p>En términos generales, una tormenta que produce vientos sostenidos de entre 34 y 63 nudos (o entre 39 y 72 millas por hora) se considera una tormenta tropical. Las tormentas con vientos superiores a 64 nudos (73 millas por hora) son huracanes (o, en los océanos Pacífico Occidental o Índico Norte, son tifones).</p><p>Los huracanes se miden por categorías entre uno y cinco, siendo los de categoría cinco los más violentos y peligrosos.</p><h2 id="-de-d-nde-provienen-los-datos-de-las-grandes-tormentas">¿De dónde provienen los datos de las grandes tormentas<strong><strong>?</strong></strong></h2><p>Existen datos históricos de tormentas fiables y en gran medida consistentes, al menos en Estados Unidos, para el último siglo y medio. Pero para entender correctamente el contexto de esos datos es necesario conocer cómo se han realizado esas observaciones a lo largo de los años.</p><p>Hasta la década de 1940, la mayor parte de las observaciones fueron realizadas por las tripulaciones de los buques oceánicos. Pero las tripulaciones de los barcos solo pueden observar e informar de lo que ven, y lo que ven estará determinado por el lugar al que vayan.</p><p>Antes de la apertura del Canal de Panamá en 1914, los barcos que viajaban entre Europa y el océano Pacífico seguían una ruta alrededor del extremo sur de Sudamérica que en gran medida no llegaba a las zonas costeras de Estados Unidos. Como resultado, es probable que un porcentaje significativo de los fenómenos meteorológicos simplemente no fueran notados.</p><p>Del mismo modo, la llegada de los aviones de reconocimiento en la década de 1940 habría permitido a los científicos captar más fenómenos que antes se habrían perdido. Y el uso de satélites meteorológicos a partir de los años sesenta ha permitido captar casi toda la actividad oceánica.</p><p>Estos cambios, y su impacto en los datos de las tormentas, se resumen claramente en esta página del sitio de la Administración Nacional Oceánica y Atmosférica (NOAA) del gobierno estadounidense, basada en un estudio de análisis de datos realizado para el Laboratorio de Dinámica de Fluidos Geofísicos (GFDL).</p><h2 id="-qu-muestra-el-registro-hist-rico"><strong>¿Qué muestra el registro histórico<strong>?</strong></strong></h2><p>Después de todos estos antecedentes, ¿qué dicen realmente los datos? ¿Son los huracanes graves más frecuentes ahora que en el pasado? Bueno, según el sitio web de la NOAA, la respuesta es: "No". Esto es lo que dicen:</p><blockquote>"Las tormentas tropicales del Atlántico de más de dos días de duración no han aumentado en número. Las tormentas que duran menos de dos días han aumentado considerablemente, pero esto se debe probablemente a la mejora de las observaciones... No conocemos una señal de cambio climático que dé lugar a un aumento solo de las tormentas de menor duración, mientras que dicho aumento es cualitativamente coherente con lo que cabría esperar de las mejoras con las prácticas de observación."</blockquote><p>La historia completa, incluyendo una buena explicación de las opciones de manipulación de datos que hicieron, la obtendrás leyendo el propio estudio. De hecho, te animo a que leas ese estudio, porque es un gran ejemplo de cómo los profesionales abordan los problemas de datos.</p><p>A partir de aquí, sin embargo, te quedarás con mis intentos amateurs y simplificados de visualizar el registro de datos en bruto y sin ajustar.</p><h2 id="datos-de-huracanes-de-estados-unidos-1851-2019">Datos de huracanes de Estados Unidos: 1851-201<strong><strong>9</strong></strong></h2><p>Nuestra fuente de datos de "Impactos/caídas de huracanes en los Estados Unidos continentales" es <a href="https://www.aoml.noaa.gov/hrd/hurdat/All_U.S._Hurricanes.html">esta página web</a> de la NOAA</p><p>Para descargar los datos, simplemente los copié haciendo clic con el ratón en la parte superior izquierda (el campo de encabezamiento "Año") y arrastrando todo el camino hasta la parte inferior derecha. A continuación, lo pegué en un editor de texto plano en mi ordenador local y lo guardé en un archivo con la extensión <code>.csv</code>.</p><h3 id="c-mo-limpiar-los-datos-de-los-huracanes">Cómo limpiar los datos de los huracanes</h3><p>Si echas un vistazo a la página web, verás que hay que limpiar el formato. Cada década se introduce con una sola fila que no contiene nada más que una cadena parecida a esto:<code>1850s</code>. Querremos eliminar esas filas. Los años sin eventos contienen la cadena <code>none</code> en la segunda columna. Esas también se tendrán que ir.</p><p>Hay algunos eventos que aparentemente no tienen datos para sus velocidades máximas de viento (Max Wind). En lugar de un número (medido en nudos), los valores de velocidad de esos eventos se representan con cinco guiones (<code>-----</code>). Tendremos que convertirlo en algo con lo que podamos trabajar.</p><p>Y, por último, aunque los meses suelen representarse con abreviaturas de tres letras, hubo un par de eventos que se extendieron a lo largo de dos meses. Para que podamos procesarlos adecuadamente, convertiré<code>Sp-Oc</code> y <code>Jl-Au</code> a <code>Sep</code> y <code>Jul</code> respectivamente.</p><p>El hecho es que en realidad no vamos a utilizar la columna del mes, por lo que esto no supondrá ninguna diferencia. Pero es una buena herramienta para conocer.</p><p>Así es como configuramos las cosas en Jupyter:</p><pre><code>import pandas as pd
import matplotlib as plt
import matplotlib.pyplot as plt 
import numpy as np

df = pd.read_csv('data-huracanes-noaa.csv')
</code></pre><p>Veamos los tipos de datos de cada columna. Podemos ignorar las cadenas de la columna Estados (States) y Nombre (Name) - no nos interesan de todos modos. Pero tendremos que hacer algo con las columnas de Fecha y Viento Máximo - no nos servirán como<code>object</code>.</p><pre><code>df.dtypes

Year                                         object
Month                                        object
States Affected and Category by States       object
Highest\nSaffir-\nSimpson\nU.S. Category    float64
Central Pressure\n(mb)                      float64
Max Wind\n(kt)                               object
Name                                         object
dtype: object
</code></pre><p>Así que voy a filtrar todas las filas en la columna Año (<code>Year</code>) para la letra <code>s</code> y simplemente las eliminaré (<code>== False</code>). Eso se encargará de todas las cabeceras de las décadas (es decir, las filas que contienen una <code>s</code> como parte de algo como <code>1850s</code>).</p><p>Del mismo modo, eliminaré las filas que contengan la cadena <code>None</code> en la columna Mes (<code>Month</code>) para eliminar los años sin tormentas.</p><p>Aunque los años tranquilos podrían tener algún impacto en nuestras visualizaciones, sospecho que incluirlos con algún tipo de valor nulo probablemente sesgaría las cosas aún más en la dirección contraria. &nbsp;También complicarían mucho nuestras visualizaciones.</p><p>Por último, reemplazaré esas dos filas de varios meses.</p><pre><code>df = df[(df.Year.str.contains("s")) == False]
df = df[(df.Month.str.contains("None")) == False]
df = df.replace('Sp-Oc','Sep')
df = df.replace('Jl-Au','Jul')
</code></pre><p>A continuación, utilizaré el práctico método de Pandas <code>to-datetime</code> para convertir las abreviaturas de tres letras del mes en números entre el 1 y el 12. El código de formato <code>%b</code> es una de las designaciones legales de Python relacionadas con la fecha y le indica a Python que estamos trabajando con una abreviatura de tres letras. Para ver la lista completa, consulte <a href="https://www.w3schools.com/python/gloss_python_date_format_codes.asp">esta página</a>.</p><pre><code>df.Month = pd.to_datetime(df.Month, format='%b').dt.month
</code></pre><p>Me gustaría ajustar un poco las cabeceras para que sean un poco más fáciles de leer y de referenciar en nuestro código. <code>df.columns</code> cambiará todos los valores de las cabeceras de las columnas a la lista que especifique aquí:</p><pre><code>df.columns =['Año', 'Mes', 'Estados', 'Categoría', 
             'Presión', 'VientoMáximo', 'Nombre']  
</code></pre><p>Tendré que convertir los datos de Año de objetos de cadena a enteros, o Python no sabrá cómo trabajar con ellos adecuadamente. Eso se hace usando <code>astype</code>.</p><p>Como se anunció, también convertiré los valores <code>null</code> en VientoMáximo a <code>NaN</code> - que NumPy leerá como "no es un número". Luego convertiré los datos en VientoMáximo de <code>object</code> a <code>float</code>.</p><pre><code>df = df.astype({'Año': 'int'})
df = df.replace('-----',np.NaN)
df = df.astype({'VientoMáximo': 'float'})
</code></pre><p>Veamos cómo queda todo eso ahora:</p><pre><code>df.dtypes

Año           int64
Mes           int64
Estados       object
Categoría     float64
Presión       float64
Viento Maximo float64
Nombre        object
dtype: object
</code></pre><p>Mucho mejor.</p><h3 id="c-mo-presentar-los-datos-de-los-huracanes"><strong>Cómo presentar los datos de los huracanes</strong></h3><p>Ahora, mirando nuestros datos, voy a sugerir que separemos las tres métricas: categoría de huracán, presión barométrica y velocidad máxima del viento.</p><p>Mi opinión es que no se gana mucho con la complicación añadida al agruparlas, y corremos el riesgo de perder de vista las importantes diferencias entre los incidentes de las tormentas más ligeras y las más graves.</p><p>Por supuesto, siempre puedo aislar las métricas individuales para ver cómo serían sus distribuciones. Utilizando <code>value_counts</code> contra la columna de categoría, por ejemplo, me muestra que los huracanes más ligeros de categoría 1 y 2 son mucho más frecuentes que los eventos más peligrosos.</p><pre><code>df['Categoría'].value_counts()

1.0    124
2.0     85
3.0     62
4.0     26
5.0      4
Name: Categoria, dtype: int64
</code></pre><p>El histograma del conjunto de datos nos da una visión general del número de eventos (representados en el eje Y) a lo largo de la historia, pero es posible que perdamos algunos detalles.</p><p>A partir de este histograma, es obvio que no ha habido ningún cambio notable en la frecuencia de las tormentas a lo largo del tiempo. Para estar seguro de que mi elección del número de intervalos que utilizamos no está ocultando involuntariamente tendencias importantes, experimente con otros valores además de 25.</p><pre><code>df.hist(column='Año', bins=25)
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/10/output.png" class="kg-image" alt="All Hurricane Events" width="385" height="264" loading="lazy"><figcaption>Todos los Eventos de Huracanes</figcaption></figure><p>Pero para poder centrarnos en cada métrica, trazaré tres gráficos distintos. Para ello, crearé tres nuevos marcos de datos y rellenaré cada uno de ellos con el contenido de la columna Año y la respectiva columna de datos.</p><pre><code>df_categoria = df[['Año','Categoría']]
df_viento = df[['Año','VientoMáximo']]
df_presion = df[['Año','Presión']]
</code></pre><p>Enviar cada uno de esos marcos de datos (dataframes) directamente a un gráfico no servirá de nada, porque no distinguirá entre la gravedad de las tormentas. Así que le mostraré cómo podemos desglosar los datos por categoría (1-5). Este bucle <code>for</code> iterará a través de los números 1-6 (que es la manera de Python para devolver los números entre 1 y 5) y utiliza cada uno de esos números a su vez para buscar huracanes de esa categoría.</p><p>Las filas cuya categoría coincida con el número se escribirán en un nuevo marco de datos (temporal) llamado <code>df1</code> que, a su vez, se utilizará para trazar un histograma. La línea <code>plt.title</code> aplica un título para el gráfico impreso que incluirá el número de categoría (el valor actual de <code>num_convertido</code>).</p><p>El bucle trabajará a través del proceso cinco veces, cada vez escribiendo el número de eventos de la categoría actual en <code>df1</code>. Los cinco histogramas se imprimirán, uno tras otro.</p><pre><code>for x in range(1, 6):
    num_cat = x
    num_convertido = str(num_cat) 
    dfcat = df_categoria['Categoría']==(x)
    df1 = df_categoria[dfcat]
    df1.hist(column='Año', bins=20)
    plt.title("Eventos Totales de la Categoría " + (num_convertido))
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/10/output1.png" class="kg-image" alt="Category 1 Hurricanes" width="375" height="264" loading="lazy"><figcaption>Huracanes de Categoría 1</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/10/output2.png" class="kg-image" alt="Category 2 Hurricanes" width="369" height="264" loading="lazy"><figcaption>Huracanes de Categoría 2</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/10/output3.png" class="kg-image" alt="Category 3 Hurricanes" width="362" height="264" loading="lazy"><figcaption>Huracanes de Categoría 3</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/10/output4.png" class="kg-image" alt="Category 4 Hurricanes" width="369" height="264" loading="lazy"><figcaption>Huracanes de Categoría 4</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/10/output5-1.png" class="kg-image" alt="Category 5 Hurricanes" width="376" height="264" loading="lazy"><figcaption>Huracanes de Categoría 5</figcaption></figure><p>Como se puede ver, no hay pruebas notables de un aumento significativo de la frecuencia de las tormentas a lo largo del tiempo.</p><p>Como siempre, analice sus datos (utilizando herramientas como <code>value_counts()</code>) para confirmar que los gráficos tienen sentido en el mundo real.</p><h2 id="datos-de-tormentas-tropicales-de-estados-unidos-1851-1965-1983-2019">Datos de tormentas tropicales de Estados Unidos: 1851-1965, 1983-2019</h2><p>Los huracanes (o ciclones) son, por supuesto, solo una parte de la historia. Un aumento de la frecuencia de las tormentas tropicales destructivas también sería motivo de preocupación.</p><p>Afortunadamente, la NOAA pone a disposición los datos pertinentes en un formato muy similar al de sus datos sobre huracanes. Aquí está la <a href="https://www.aoml.noaa.gov/hrd/hurdat/uststorms.html">página</a> web donde encontrarás el gráfico. Copia los datos en un archivo <code>.csv</code> de la misma manera que antes.</p><p>Sin embargo, observe que no hay datos para los años 1966-1982. No me pregunten por qué. Simplemente no hay. Es curioso el clima.</p><p>Yo crearía un nuevo Jupyter notebook para esta parte del proyecto, ya que no hay nada que vayamos a necesitar de la versión de huracanes. Por lo tanto, se configurarán las cosas como siempre:</p><pre><code>import pandas as pd
import matplotlib as plt
import numpy as np
df = pd.read_csv('tormentas-tropicales-usa-noaa.csv')
</code></pre><h3 id="limpiemos-los-datos-de-las-tormentas-tropicales"><strong><strong>L</strong></strong>impiemos Los Datos De Las Tormentas Tropicales</h3><p>Las filas que representan años sin eventos deberían, de nuevo, ser eliminadas:</p><pre><code>df = df[(df.Date.str.contains("None")) == False]
</code></pre><p>La columna Fecha (<code>Date</code>) de este conjunto de datos tiene caracteres que apuntan a cinco notas a pie de página: $, *, #, % y &amp;. Las notas a pie de página contienen información importante, pero esos caracteres nos darán problemas si no los eliminamos.</p><p>Estos comandos lo conseguirán, sustituyendo todas esas cadenas en la columna Fecha por nada:</p><pre><code>df['Date'] = df.Date.str.replace('\$', '')
df['Date'] = df.Date.str.replace('\*', '')
df['Date'] = df.Date.str.replace('\#', '')
df['Date'] = df.Date.str.replace('\%', '')
df['Date'] = df.Date.str.replace('\&amp;', '')
</code></pre><p>A continuación, voy a restablecer los encabezados de las columnas. En primer lugar, porque será más fácil trabajar con nombres bonitos y cortos. Pero principalmente porque, como administrador de sistemas de Linux, encuentro los espacios en los nombres de archivos o en los encabezados moralmente ofensivos.</p><pre><code>df.columns =['Tormenta#', 'Fecha', 'Tiempo', 'Lat', 'Lon', 
             'VientoMáximo', 'EstadoTierra', 'NombreTormenta'] 
</code></pre><p>Los tipos de datos de las columnas van a necesitar algo de trabajo:</p><pre><code>df.dtypes

Tormenta#            object
Fecha                object
Tiempo               object
Lat                  object
Lon                  object
VientoMáximo         float64
EstadoTierra         object
NombreTormenta       object
dtype: object
</code></pre><p>Veamos cómo se ven nuestros datos:</p><pre><code>df.head()


Tormenta#	Fecha	Tiempo	Lat	Lon	VientoMáximo	EstadoTierra	NombreTormenta
1	6	10/19/1851	1500Z	41.1N	71.7W	50.0	NY	NaN
6	3	8/19/1856	1100Z	34.8	76.4	50.0	NC	NaN
7	4	9/30/1857	1000Z	25.8	97	50.0	TX	NaN
8	3	9/14/1858	1500Z	27.6	82.7	60.0	FL	NaN
9	3	9/16/1858	0300Z	35.2	75.2	50.0	NC	NaN
</code></pre><p>La verdad es que no estoy seguro de lo que significan esos valores de <code>Tormenta#</code>, pero no hacen daño a nadie. Las fechas tienen un formato mucho mejor que el de los datos de los huracanes. Pero tendré que convertirlas a un nuevo formato. Hagámoslo bien y vayamos con <code>datetime</code>.</p><pre><code>df.Fecha = pd.to_datetime(df.Fecha)
</code></pre><h3 id="c-mo-presentar-los-datos-de-la-tormenta-tropical">Cómo presentar los datos de la tormenta tropical</h3><p>Para nuestros propósitos, la única columna de datos que realmente importa es <code>VientoMáximo</code> - ya que es lo que define la intensidad de la tormenta. Este comando creará un nuevo marco de datos compuesto por las columnas <code>Fecha</code> y <code>VientoMáximo</code>:</p><pre><code>df1 = df[['Fecha','VientoMáximo']]
</code></pre><p>No hay razón para aplazar esto: también podemos disparar un histograma de inmediato. Verás inmediatamente la brecha alrededor de 1970, donde no había datos. También verás que, de nuevo, no parece haber mucha tendencia al alza.</p><pre><code>df1['Fecha'].hist()
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/01/ts_image_1.png" class="kg-image" alt="Histogram of All Tropical Storms" width="600" height="400" loading="lazy"><figcaption>Histograma de Todas las Tormentas Tropicales</figcaption></figure><p>Pero realmente deberíamos profundizar un poco más aquí. Después de todo, estos datos sólo mezclan tormentas de 30 nudos con otras de 75 nudos. Definitivamente querremos saber si están ocurriendo o no a ritmos similares.</p><p>Averigüemos cuántas filas de datos tenemos. <code>shape</code> nos dice que tenemos 362 eventos en total.</p><pre><code>print(df1.shape)

(362, 2)
</code></pre><p>La impresión de nuestro marco de datos nos muestra que los valores de <code>VientoMáximo</code> son todos múltiplos de 5. Si escaneas los datos por ti mismo, verás que oscilan entre 30 y 70 más o menos.</p><pre><code>df1

	Fecha		VientoMaximo
1	1851-10-19	50.0
6	1856-08-19	50.0
7	1857-09-30	50.0
8	1858-09-14	60.0
9	1858-09-16	50.0
...	...	...
391	2017-09-27	45.0
392	2018-05-28	40.0
393	2018-09-03	45.0
394	2018-09-03	45.0
395	2019-09-17	40.0
362 rows × 2 columns
</code></pre><p>Así que dividamos nuestros datos en cuatro conjuntos más pequeños, como aproximaciones razonables a tormentas de distintos niveles de intensidad. He creado cuatro marcos de datos y los he rellenado con eventos que caen en sus rangos más estrechos (es decir, entre 30 y 39 nudos, 40 y 49, 50 y 59, y 60 y 79). Esto debería darnos un marco de referencia razonable para nuestros eventos.</p><pre><code>df_30 = df1[df1['VientoMáximo'].between(30, 39)]
df_40 = df1[df1['VientoMáximo'].between(40, 49)]
df_50 = df1[df1['VientoMáximo'].between(50, 59)]
df_60 = df1[df1['VientoMáximo'].between(60, 79)]
</code></pre><p>Confirmemos que los puntos de corte que hemos elegido tienen sentido. Este código imprimirá de forma atractiva el número de filas en el índice de cada uno de nuestros cuatro formularios de datos.</p><pre><code>st1 = len(df_30.index)
print('El número de tormentas entre 30 y 39: ', st1)
st2 = len(df_40.index)
print('El número de tormentas entre 40 y 49: ', st2)
st3 = len(df_50.index)
print('El número de tormentas entre 50 y 59: ', st3)
st4 = len(df_60.index)
print('El número de tormentas entre 60 y 79: ', st4)

El número de tormentas entre 30 y 39:  51
El número de tormentas entre 40 y 49:  113
El número de tormentas entre 50 y 59:  142
El número de tormentas entre 60 y 79:  56
</code></pre><p>Probablemente haya una forma elegante de combinar esos cuatro comandos en uno solo. Pero mi filosofía es que la sintaxis que me llevaría una hora averiguar nunca superará la simplicidad de cinco segundos de cortar y pegar. Nunca.</p><p>También podemos profundizar un poco más en los datos utilizando nuestro viejo amigo, <code>value_counts()</code>. Esto nos mostrará que hubo 71 eventos de 40 nudos y 42 eventos de 45 nudos a lo largo de nuestro rango de tiempo.</p><pre><code>df_40['VientoMáximo'].value_counts()

40.0    71
45.0    42
Name: VientoMáximo, dtype: int64
</code></pre><p>Podemos trazar un único gráfico de líneas para mostrar los cuatro subconjuntos juntos. Este gráfico añade etiquetas en los ejes y en el gráfico y una leyenda para facilitar la comprensión de los datos. El valor <code>subplot(111)</code> controla el tamaño de la figura.</p><pre><code>fig = plt.figure()
ax = plt.subplot(111)
df_30['VientoMáximo'].plot(ax=ax, label='df_30')
df_40['VientoMáximo'].plot(ax=ax, label='df_40')
df_50['VientoMáximo'].plot(ax=ax, label='df_50')
df_60['VientoMáximo'].plot(ax=ax, label='df_60')
ax.set_ylabel('Velocidad del Viento en Nudos')
ax.set_xlabel('Tiempo Entre 1851 y 2019')
plt.title('Tormentas Tropicales por Velocidad del Viento Máximo (nudos)')
ax.legend()
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/10/output-2.png" class="kg-image" alt="All Tropical Storms" width="404" height="278" loading="lazy"><figcaption>Todas las Tormentas Tropicales</figcaption></figure><p>Esto puede ser útil para confirmar que no estamos desordenando los datos. La comprobación visual mostrará, por ejemplo, que en nuestro conjunto de datos sólo hubo un único evento de 30 nudos y que tuvo lugar hacia el final de nuestro marco temporal en 2016. Pero no es una buena manera de mostrarnos los cambios en la frecuencia de los eventos.</p><p>Para ello, miraremos los datos que contiene cada uno de nuestros marcos de datos.</p><pre><code>df_30['Fecha'].hist(bins=20)
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/01/ts_image_3.png" class="kg-image" alt="30-39 Knot Events" width="600" height="400" loading="lazy"><figcaption>Eventos de 30-39 Nudos</figcaption></figure><pre><code>df_40['Fecha'].hist(bins=20)
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/01/ts_image_4.png" class="kg-image" alt="40-49 Knot Events" width="600" height="400" loading="lazy"><figcaption>Eventos de 40-49 Nudos</figcaption></figure><pre><code>df_50['Fecha'].hist(bins=20)
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/01/ts_image_5.png" class="kg-image" alt="50-59 Knot Events" width="600" height="400" loading="lazy"><figcaption>Eventos de 50-59 Nudos</figcaption></figure><pre><code>df_60['Fecha'].hist(bins=20)
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/01/ts_image_6.png" class="kg-image" alt="60-79 Knot Events" width="600" height="400" loading="lazy"><figcaption>Eventos de 60-79 Nudos</figcaption></figure><p>Un rápido vistazo a estos cuatro gráficos nos muestra una frecuencia de eventos bastante consistente a lo largo de los 150 años de nuestros datos. De nuevo, pruébalo tú mismo utilizando diferentes números de intervalos para asegurarte de que no estamos pasando por alto algunas tendencias importantes.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
