Comunidad de diseño web y desarrollo en internet

Lenguajes funcionales y la clase Array de ActionScript 3

Recientemente tuve una idea para solucionar de una manera más o menos elegante un problema que tuve en actionscript 3. Lamentablemente, uno de mis co-workers me avisó que eso ya se había inventado hace décadas y que era una de las bases de los llamados lenguajes funcionales.

Así que, luego de una investigación de 15 minutos en Wikipedia y Google aprendí que los lenguajes funcionales (como LISP o Phyton) permiten ejecutar una función en un Array (es decir, elemento a elemento)

El hecho de que AS3 incluya estas operaciones puede ser sumamente útil en muchísimos casos. Veamos de qué se trata (para acortar espacio, obvié la función en donde ubico el trace, para probar los ejemplos, incluir el trace en el constructor):

every

Descripción: Ejecuta una función en cada elemento del Array hasta que la función devuelva false. La evaluación devuelve true si la función devolvió true para todos los elementos del Array.

Uso: verificar si los elementos de un Array cumplen determinada condición.

Ejemplo (nos dice si un Array está ordenado de forma creciente):

Código :

private var myArray:Array = new Array (3, 4, 6, 9, 10, 11);
private var myPrev:int = myArray[0];
private function myEveryFunction (item:*, index:int, array:Array):Boolean
{
   if (index == 0) return true;
   
   if (myPrev < item)
   {
      myPrev = item;
      return true;
   }
   return false;
}
trace (myArray.every (myEveryFunction)); // Output: true


Parámetros: Como parámetros le pasamos la función que queremos ejecutar y un objeto cualquiera que serviría de this.

filter

Descripción: Devuelve un Array con todos los elementos que cumplen determinada condición.

Uso: Como su nombre lo indica, filtrar elementos de un Array.

Ejemplo (devuelve los valores numéricos del Array):

Código :

private var myArray:Array = new Array (3, 5, "texto", this, 11);
private function myFilterFunction (item:*, index:int, array:Array):Boolean
{
   return item is Number;
}
trace (myArray.filter (myFilterFunction)); // Output: 3,5,11


Parámetros: Como parámetros le pasamos la función que queremos ejecutar y un objeto cualquiera que serviría de this.

forEach

Descripción: Ejecuta una función una vez por cada item del Array. No devuelve nada.

Uso: A primera vista puede parecer algo inutil, en la práctica resulta interesante para reemplazar el for. El mejor uso que le encontré hasta ahora es el del ejemplo (con ciertas variantes, por supuesto)

Ejemplo (mueve todos los MovieClips a su siguiente posición):

Código :

private var myArray:Array = new Array (mc1, mc2, mc3);
private function myForEachFunction (item:*, index:int, array:Array):void
{
   item.moveToNextPos ();
}
myArray.forEach (myForEachFunction);


Parámetros: Como parámetros le pasamos la función que queremos ejecutar y un objeto cualquiera que serviría de this.

map

Descripción: Devuelve un Array compuesto por los valores que devolvió la función.

Uso: Muchísimos usos, es sorprendentemente útil.

Ejemplo (devuelve una lista con los primeros cuadrados perfectos):

Código :

private var myArray:Array = new Array (1, 2, 3, 4, 5, 6);
private function myMapFunction (item:*, index:int, array:Array):int
{
   return item * item;
}
trace (myArray.map (myMapFunction)); // Output: 1,4,9,16,25,36


Parámetros: Como parámetros le pasamos la función que queremos ejecutar y un objeto cualquiera que serviría de this.

some

Descripción: El hermano gemelo de every, ejecuta una función hasta que ésta devuelve true.

Uso: prácticamente los mismos que every.

Ejemplo (nos dice si un Array tiene elementos indefinidos):

Código :

private var myArray:Array = new Array (3, 4, undefined, 9, 10, 11);
private function mySomeFunction (item:*, index:int, array:Array):Boolean
{
   return item == undefined;
}
trace (myArray.some (mySomeFunction)); // Output: true


Parámetros: Como parámetros le pasamos la función que queremos ejecutar y un objeto cualquiera que serviría de this.

Y eso es todo, pero como vimos, el potencial de estos métodos es enorme. En lo personal voy a comenzar a usarlos bastante, más que nada por su potencial de simplificar código.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate