{"id":444,"date":"2022-10-06T13:16:23","date_gmt":"2022-10-06T11:16:23","guid":{"rendered":"http:\/\/quadern-programacio.recursos.uoc.edu\/?page_id=444"},"modified":"2022-10-07T13:27:55","modified_gmt":"2022-10-07T11:27:55","slug":"9-3-arrays","status":"publish","type":"page","link":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/9-3-arrays\/","title":{"rendered":"9.3. <em>Arrays<\/em>"},"content":{"rendered":"<p>Cuando en nuestros <em>skteches<\/em> tenemos pocos elementos, el uso de variables nos puede ser suficiente, pero cuando comenzamos a tener muchos elementos de los cuales tenemos que almacenar alguna informaci\u00f3n que var\u00eda a lo largo de la ejecuci\u00f3n del programa, el uso de variables se nos puede quedar corto y necesitamos nuevas estructuras que nos permitan almacenar y modificar datos de manera m\u00e1s sencilla y flexible. Con el \u00faltimo ejemplo de los objetos ve\u00edamos que si quer\u00edamos a\u00f1adir una segunda flor, no ten\u00edamos m\u00e1s que a\u00f1adir una nueva variable, pero \u00bfy si queremos crear cincuenta flores? Crear una variable para cada una no parece que sea muy eficiente.<\/p>\n<p>Los <em>arrays<\/em> son una estructura de datos que nos permite almacenar muchas variables bajo un mismo nombre, lo cual nos va a permitir trabajar de manera mucho m\u00e1s sencilla y eficiente.<\/p>\n<p>Trabajar con <em>arrays<\/em> es similar a trabajar con variables: necesitamos crearlos y asignarles valores que luego utilizaremos.<\/p>\n<h3>Creando y asignando valores a los <em>arrays<\/em><\/h3>\n<p>Para crear un <em>array<\/em>, podemos hacerlo de la siguiente manera:<\/p>\n<pre>let values = [100, 200, 300];<\/pre>\n<p>Igual que con las variables, utilizamos la palabra clave <span class=\"courier\">let<\/span> seguida del nombre que le queramos dar al <em>array<\/em> y a continuaci\u00f3n le asignamos los valores que queramos entre corchetes y separados con una coma. Con esto, lo que hemos hecho ha sido crear un <em>array<\/em> de tres elementos. En este caso, le hemos asignado valores num\u00e9ricos, pero podr\u00eda ser cualquier tipo de valor, incluso valores de distintos tipos en un mismo <em>array<\/em>:<\/p>\n<pre>let values = [100, 200, 300];\r\nlet colors = [\"pink\", \"lightblue\", \"lightgreen\"];\r\nlet booleans = [true, false, false, true];\r\nlet mixedValues = [23, true, \"yellow\"];<\/pre>\n<h3>Accediendo a los valores de un <em>array<\/em><\/h3>\n<figure id=\"attachment_278\" aria-describedby=\"caption-attachment-278\" style=\"width: 540px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-278\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_119.jpg\" alt=\"\" width=\"540\" height=\"138\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_119.jpg 540w, \/wp-content\/uploads\/2022\/10\/PID_00290094_119-300x77.jpg 300w\" sizes=\"(max-width: 540px) 100vw, 540px\" \/><figcaption id=\"caption-attachment-278\" class=\"wp-caption-text\">Figura 120. Estructura de un <em>array<\/em><br \/>Fuente: adaptaci\u00f3n de L. McCarthy; A. P. C. Reas; B. Fry (2015). <em>Getting Started with P5.Js: Making Interactive Graphics in JavaScript and Processing<\/em>. Make Community, LLC.<\/figcaption><\/figure>\n<p>Cada uno de los elementos de un <em>array<\/em> tiene un <strong>\u00edndice<\/strong> para determinar su posici\u00f3n en el <em>array<\/em>. Igual que ocurre con las coordenadas, para las posiciones de un <em>array<\/em> comenzamos a contar desde el cero.<\/p>\n<p>Para acceder a los elementos del <em>array<\/em> necesitaremos conocer su \u00edndice. Tomando como ejemplo el <em>array<\/em> de la figura 120, podemos acceder a sus elementos de la siguiente manera:<\/p>\n<pre>console.log(years[0]);   \/\/ Imprime 1920\r\nlet x = years[2];\r\nlet y = years[4];\r\nconsole.log(x + y);      \/\/ Imprime 3990 (1980 + 2010)<\/pre>\n<p>Una propiedad de los <em>arrays<\/em> que nos resultar\u00e1 muy \u00fatil ser\u00e1 su tama\u00f1o, que podemos averiguar mediante su propiedad <span class=\"courier\">length<\/span>:<\/p>\n<pre>let colors = [\"pink\", \"blue\", \"red\"];\r\nconsole.log(colors.length);                \/\/ Imprime 3\r\n\r\nlet values = [];\r\nconsole.log(values.length);                \/\/ Imprime 0\r\n\r\n\/\/ Para acceder al \u00faltimo elemento de cualquier array\r\n\/\/ sea del tama\u00f1o que sea\r\nconsole.log(colors[colors.length - 1]);    \/\/ Imprime \u201cred\u201d<\/pre>\n<p>Del mismo modo que ocurre con las variables, es com\u00fan que queramos acceder a un <em>array<\/em> tanto desde el <span class=\"courier\">setup()<\/span> como desde el <span class=\"courier\">draw()<\/span>, por lo que querremos declararlo al principio del c\u00f3digo y m\u00e1s tarde asignarles valores. Esto lo podemos hacer creando al principio del c\u00f3digo un <em>array<\/em> vac\u00edo:<\/p>\n<pre>let values = [];\r\n\r\nfunction setup() {\r\n  values[0] = 34553;\r\n  values[1] = 13234;\r\n}<\/pre>\n<p>Veamos un peque\u00f1o ejemplo de un <em>array<\/em> en uso para elegir aleatoriamente entre un set de colores preestablecidos.<\/p>\n<figure id=\"attachment_280\" aria-describedby=\"caption-attachment-280\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-280\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_120.jpg\" alt=\"\" width=\"800\" height=\"569\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_120.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_120-300x213.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_120-768x546.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-280\" class=\"wp-caption-text\">Figura 121. Usando <em>arrays<\/em><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>En este ejemplo, creamos un <em>array<\/em> con tres colores y en la funci\u00f3n <span class=\"courier\">chooseColor()<\/span> elegimos aleatoriamente mediante <span class=\"courier\">random()<\/span> un n\u00famero entre 0 y el tama\u00f1o del <em>array<\/em> (en este caso, entre 0 y 2) para luego acceder al elemento del <em>array<\/em> cuyo \u00edndice es ese n\u00famero aleatorio y lo aplicamos como relleno del c\u00edrculo. Si hacemos clic con el rat\u00f3n, elegiremos otro elemento del <em>array<\/em> al azar. Elegir un elemento aleatorio dentro de un <em>array<\/em> es una operaci\u00f3n bastante com\u00fan en el mundo de la computaci\u00f3n creativa y P5 nos ofrece una manera m\u00e1s sencilla de hacerlo usando <span class=\"courier\">random()<\/span>:<\/p>\n<pre>let colors = [\"red\", \"green\", \"blue\"];\r\nlet randomColor = random(colors);<\/pre>\n<p>Si a <span class=\"courier\">random()<\/span> le pasamos como par\u00e1metro un <em>array<\/em>, nos devolver\u00e1 directamente un elemento al azar de ese <em>array<\/em>.<\/p>\n<h3>Asignar y acceder a los valores de un <em>array<\/em> mediante bucles<\/h3>\n<p>Hasta ahora hemos asignado y accedido a los valores de nuestros <em>arrays<\/em> de manera \u00abmanual\u00bb, con lo que realmente no hemos ganado mucho respecto a cuando ten\u00edamos que crear m\u00faltiples variables. Sin embargo, podemos automatizar este proceso utilizando bucles tanto para asignar valores a los <em>arrays<\/em> como para acceder a estos.<\/p>\n<figure id=\"attachment_282\" aria-describedby=\"caption-attachment-282\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-282\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_121.jpg\" alt=\"\" width=\"800\" height=\"365\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_121.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_121-300x137.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_121-768x350.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-282\" class=\"wp-caption-text\">Figura 122. Declarando y accediendo a valores de un <em>array<\/em> mediante bucles<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>En el ejemplo anterior creamos un <em>array<\/em> vac\u00edo al que en el <span class=\"courier\">setup()<\/span> le asignamos 100 valores aleatorios usando el valor de i, que itera desde 0 hasta 99 para asignar el valor en el \u00edndice correspondiente del <em>array<\/em>. A continuaci\u00f3n, en el <span class=\"courier\">draw()<\/span> iteramos a trav\u00e9s del <em>array<\/em> previamente creado usando tambi\u00e9n un bucle que va desde el elemento 0 hasta el elemento 99, ya que el <em>array<\/em> tiene 100 elementos y estamos usando &lt; y no &lt;=. Usamos esos valores aleatorios almacenados en el <em>array<\/em> para dibujar l\u00edneas horizontales en coordenadas verticales aleatorias.<\/p>\n<p>Todo esto lo podr\u00edamos replicar haciendo uso \u00fanicamente de bucles y <span class=\"courier\">random()<\/span>, pero tendr\u00edamos que utilizar tambi\u00e9n un <span class=\"courier\">noLoop()<\/span> o manipular el <span class=\"courier\">frameRate()<\/span> para que los valores de las posiciones en la coordenada <em>y<\/em> de las l\u00edneas no cambiase en cada <em>frame<\/em>, lo que nos impedir\u00eda utilizar las capacidades interactivas de P5. Adem\u00e1s, tenemos acceso a estos valores de posici\u00f3n en <em>y<\/em>, por lo que podr\u00edamos hacer que estos valores variasen a lo largo del tiempo.<\/p>\n<p>Dentro de un <em>array <\/em>podemos almacenar cualquier tipo de dato, incluso otros <em>arrays<\/em>, lo cual puede resultar muy \u00fatil a la hora de crear conjuntos de coordenadas (<em>x<\/em>, <em>y<\/em>) por ejemplo.<\/p>\n<pre>let positions = [[100, 50], [20, 70], [120, 60]];\r\n\r\nconsole.log(positions[0]);     \/\/ Imprime [100, 50]\r\nconsole.log(positions[0][0]);  \/\/ Imprime 100\r\nconsole.log(positions[0][1]);  \/\/ Imprime 50\r\n\r\nconsole.log(positions[1][0]);  \/\/ Imprime 20<\/pre>\n<p>Veamos un ejemplo algo m\u00e1s complejo utilizando <em>arrays<\/em> dentro de otro <em>array:<\/em><\/p>\n<figure id=\"attachment_284\" aria-describedby=\"caption-attachment-284\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-284\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_122.jpg\" alt=\"\" width=\"800\" height=\"476\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_122.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_122-300x179.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_122-768x457.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-284\" class=\"wp-caption-text\">Figura 123. Anidando <em>arrays<\/em><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>En esta ocasi\u00f3n, a la hora de rellenar el <em>array <\/em>lo hemos hecho con otros <em>arrays<\/em> de dos elementos, por lo que en <span class=\"courier\">snowPos<\/span> tenemos un total de 120 elementos y cada uno de estos almacena a su vez dos elementos: valores aleatorios entre 0 y el ancho o el alto del <em>canvas<\/em>. Estos dos elementos son a los que podemos acceder mediante <span class=\"courier\">snowPos[i][0]<\/span> y <span class=\"courier\">snowPos[i][1]<\/span> para utilizarlos como coordenadas de nuestros copos de nieve. Para darles movimiento de ca\u00edda, a cada elemento <span class=\"courier\">snowPos[i][1]<\/span> (la coordenada <em>y<\/em> de cada copo) le vamos aumentando su valor. Si vemos que se sale de la pantalla, hacemos que vuelva a aparecer por arriba y le damos un nuevo valor de <span class=\"courier\">snowPos[i][0]<\/span> (la coordenada <em>x<\/em>).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cuando en nuestros skteches tenemos pocos elementos, el uso de variables nos puede ser suficiente, pero cuando comenzamos a tener muchos elementos de los cuales tenemos que almacenar alguna informaci\u00f3n que var\u00eda a lo largo de la ejecuci\u00f3n del programa, el uso de variables se nos puede quedar corto y necesitamos nuevas estructuras que nos [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/444"}],"collection":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/comments?post=444"}],"version-history":[{"count":3,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/444\/revisions"}],"predecessor-version":[{"id":570,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/444\/revisions\/570"}],"wp:attachment":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/media?parent=444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}