{
    "componentChunkName": "component---src-posts-post-page-js",
    "path": "/posts/nuevas-funcionalidades-en-javascript/",
    "result": {"data":{"markdownRemark":{"html":"<p>Todos los años tenemos nuevas actualizaciones en JavaScript que permiten hacer nuestra lógica de manera más legible y si se puede con menos lineas de código.</p>\n<p>En este pequeño escrito voy a mencionar algunas de estas por las cuales estoy emocionado (Algunas de estas estan todavia en etapa experimental).</p>\n<h2>Array</h2>\n<h3>Array.prototype.at</h3>\n<p>Esta funcionalidad es una de las que pienso “Porque mierda no la metieron desde mucho antes”. Como todos saben, para acceder a un elemento que se encuentra en un listado a travez del índice se debe pasar este último dentro de llaves cuadradas, i.e.</p>\n<deckgo-highlight-code  terminal=\"carbon\" theme=\"dracula\"  >\n          <code slot=\"code\">const list = [&#39;banana&#39;, &#39;coconut&#39;, &#39;pineapple&#39;]\n\nconst lastElement = list[2] // pineapple</code>\n        </deckgo-highlight-code>\n<p>Lo que se ve arriba esta bastante bien PERO hay detalles cuando quieres acceder a los últimos elementos de la lista. Tu supondrías que puedes acceder al último elemento de la lista de la misma manera que lo haces para el primero pero no, no podrías estar más equivocado, y es aquí donde no entiendes las decisiones que toma el cómite del EcmaScript</p>\n<deckgo-highlight-code  terminal=\"carbon\" theme=\"dracula\"  >\n          <code slot=\"code\">const list = [&#39;banana&#39;, &#39;coconut&#39;, &#39;pineapple&#39;]\n\nconst lastElement = list[-1] // undefined\n\n// The correct way to iterate thru the list in reverse order\n// is practically doing an operation. The length of the list - the element\n\nconst lastElement = list[list.length - 1] // pineapple</code>\n        </deckgo-highlight-code>\n<p>Si, es aquí cuando te preguntas porque hacen eso y solo queda aceptar la realidad.</p>\n<p>Pero afortunadamente hay que gente cuerda y entiende que debe haber maneras más sencillas de hacer esto, y es aquí donde viene <em>.at</em></p>\n<deckgo-highlight-code  terminal=\"carbon\" theme=\"dracula\"  >\n          <code slot=\"code\">const list = [&#39;banana&#39;, &#39;coconut&#39;, &#39;pineapple&#39;]\n\nconst firstElement = list.at(0) // banana\nconst lastElement = list.at(-1) // pineapple</code>\n        </deckgo-highlight-code>\n<p>A que es bello. Gracias a esas personas que pensaron en esto y lo hicieron posible.</p>\n<h3>Array.prototype.groupBy y Array .prototype.groupByToMap</h3>\n<p>No te ha pasado que tienes un listado de elementos y necesitas agruparlos por un tipo en dato en específico, si no te ha tocado ¿qué rayos es lo que haces?. Para lograr hacer este tipo de agrupamiento hay varias formas de hacerlo pero generalmente tocaba iterar por cada uno de los elemento, inicializar una colección vacía y agregar los elementos en el formato que se quería.</p>\n<p>Ahora con la incorporación de estos métodos no podría ser más sencillo.</p>\n<deckgo-highlight-code  terminal=\"carbon\" theme=\"dracula\"  >\n          <code slot=\"code\">const inventory = [\n  { name: &#39;asparagus&#39;, type: &#39;vegetables&#39;, quantity: 5 },\n  { name: &#39;bananas&#39;,  type: &#39;fruit&#39;, quantity: 0 },\n  { name: &#39;goat&#39;, type: &#39;meat&#39;, quantity: 23 },\n  { name: &#39;cherries&#39;, type: &#39;fruit&#39;, quantity: 5 },\n  { name: &#39;fish&#39;, type: &#39;meat&#39;, quantity: 22 }\n];\n\nconst group = inventory.groupBy(({ type }) =&gt; type)\n\n/* group is:\n{ \n  vegetables: [\n    { name: &#39;asparagus&#39;, type: &#39;vegetables&#39;, quantity: 5 }, \n  ],\n  fruit: [\n    { name: &quot;bananas&quot;, type: &quot;fruit&quot;, quantity: 0 },\n    { name: &quot;cherries&quot;, type: &quot;fruit&quot;, quantity: 5 }\n  ], \n  meat: [\n    { name: &quot;goat&quot;, type: &quot;meat&quot;, quantity: 23 },\n    { name: &quot;fish&quot;, type: &quot;meat&quot;, quantity: 22 }\n  ] \n}\n*/</code>\n        </deckgo-highlight-code>\n<p>¿Sencillo verdad?. Estos métodos va ayudar a muchos desarrolladores a reducir tiempo en sus trabajos y reducir la cantidad de lineas de código.</p>\n<p>Por cierto, esta no es la única manera de hacerlo, como tal, el método recibe o espera una función que recibe como parametro el elemento, lo que permite que jueges en como quieres hacer las agrupaciones o la lógica para estas.</p>\n<deckgo-highlight-code  terminal=\"carbon\" theme=\"dracula\"  >\n          <code slot=\"code\">const inventory = [\n  { name: &#39;asparagus&#39;, type: &#39;vegetables&#39;, quantity: 5 },\n  { name: &#39;bananas&#39;,  type: &#39;fruit&#39;, quantity: 0 },\n  { name: &#39;goat&#39;, type: &#39;meat&#39;, quantity: 23 },\n  { name: &#39;cherries&#39;, type: &#39;fruit&#39;, quantity: 5 },\n  { name: &#39;fish&#39;, type: &#39;meat&#39;, quantity: 22 }\n];\n\nfunction myCallback( { quantity } ) {\n  return quantity &gt; 5 ? &#39;ok&#39; : &#39;restock&#39;;\n}\n\nconst group = inventory.groupBy( myCallback );\n\n/* group is:\n{ \n  restock: [\n    { name: &quot;asparagus&quot;, type: &quot;vegetables&quot;, quantity: 5 },\n    { name: &quot;bananas&quot;, type: &quot;fruit&quot;, quantity: 0 },\n    { name: &quot;cherries&quot;, type: &quot;fruit&quot;, quantity: 5 }\n  ], \n  ok: [\n    { name: &quot;goat&quot;, type: &quot;meat&quot;, quantity: 23 },\n    { name: &quot;fish&quot;, type: &quot;meat&quot;, quantity: 22 }\n  ] \n}\n*/</code>\n        </deckgo-highlight-code>\n<p>Como puedes ver es una manera muy práctica de hacer agrupaciones que estoy seguro muchos desarrolladores/as comenzaran a usar.</p>\n<p>El otro método usado es <em>Array.groupByToMap</em> básicamente lo que hace es lo mismo que su compañero pero en vez de retornar un objeto, retorna un <em>Map</em>.</p>\n<deckgo-highlight-code  terminal=\"carbon\" theme=\"dracula\"  >\n          <code slot=\"code\">const inventory = [\n  { name: &#39;asparagus&#39;, type: &#39;vegetables&#39;, quantity: 5 },\n  { name: &#39;bananas&#39;,  type: &#39;fruit&#39;, quantity: 0 },\n  { name: &#39;goat&#39;, type: &#39;meat&#39;, quantity: 23 },\n  { name: &#39;cherries&#39;, type: &#39;fruit&#39;, quantity: 5 },\n  { name: &#39;fish&#39;, type: &#39;meat&#39;, quantity: 22 }\n];\n\nconst restock  = { restock: true };\nconst sufficient = { restock: false };\n\nconst result = inventory.groupByToMap( ({ quantity }) =&gt; quantity &lt; 6 ? restock : sufficient );\nconsole.log(result.get(restock));\n// expected output: Array [Object { name: &quot;bananas&quot;, type: &quot;fruit&quot;, quantity: 5 }]</code>\n        </deckgo-highlight-code>\n<p>Tiene un detalle. Al usar este método ten presente que debes usar la misma key para obtener el/los elemento/s.</p>\n<h2>Operator</h2>\n<h3>Coalescing operator</h3>\n<p>¿ Estas cansado de usar el operador ternario ? ¿ Crees que deberían haber maneras más sencillas de validar datos ? ¿ leíste lo anterior con voz de comerciante en televisión ?. Hay una solución para lo anterior ( excepto la voz de comerciante ) y es la implementación de este nuevo operador lógico.</p>\n<deckgo-highlight-code  terminal=\"carbon\" theme=\"dracula\"  >\n          <code slot=\"code\">const customer = {\n\tfirstName: &#39;fernando&#39;,\n\tlastName: &#39;pineda&#39;,\n\tage: 30,\n\tisActive: true,\n\taddress: {\n\t\tcity: &#39;Bogota&#39;,\n\t\tcountry: &#39;Colombia&#39;,\n\t}\n}\n\n// Let&#39;s say you want to get the address information\n// but as these information could be optional\n// you need to validate if the field has data\n\n/*\n\tlet customerAddress = null\n\tif ( customer.addess &amp;&amp; customer.addess.city ) {\n\t\tcustomerAddress = customer.address\n\t} else {\n\t\tcustomerAddress = {\n\t\t\tcity: &#39;&#39;,\n\t\t\tcountry: &#39;&#39;\n\t\t}\n\t}\n*/\n\n// A shorter way of doing the above is\n\nconst customerAddress = customer.address ?? { city: &#39;&#39;, country: &#39;&#39; }</code>\n        </deckgo-highlight-code>\n<p>El uso de los dobles signos de interrogación permite comparar el valor del operando a la izquierda del operador, si este es un valor Nullish (null, undefined. Esta es u diferencia con el operando || que considera valores Falsy ), retorna el operando de la derecha.</p>","frontmatter":{"title":"JavaScript: Nuevas Funcionalidades ","image":"/assets/es_portrait.svg"},"excerpt":"Todos los años tenemos nuevas actualizaciones en JavaScript que permiten hacer nuestra lógica de manera más legible y si se puede con menos…"}},"pageContext":{"slug":"/posts/nuevas-funcionalidades-en-javascript/","title":"JavaScript: Nuevas Funcionalidades "}},
    "staticQueryHashes": ["63159454"]}