Quiero presentar mi clase ArrayHelpers, es de mi carpeta de Clases/Utils, donde tengo algunos trucos para trabajar rápido con tipos de datos usuales. En este caso, Arrays. A mi gusto, a Actionscript 3 le faltan algunas funciones para trabajar con Arrays en formato más avanzado (Ejemplo: Tracking de un carrito sin grabarlo a ningún lado).
La clase en cuestión, ArrayHelpers
Código :
package com.clases.utils { import flash.events.*; import flash.net.*; public class ArrayHelpers { function ArrayHelpers() {} public function position(Arr:Array, Str:String):Number { for (var i:int = 0; i < Arr.length; i++) { if (Arr[i] == Str) { return i; } } return -1; } public function positionAll(Arr:Array, Str:String):String { var temp:Array = []; for (var i:int = 0; i < Arr.length; i++) { if (Arr[i] == Str) { temp.push(i); } } if (temp.length > 0) { return new String(temp); } return "-1"; } public function deleteAt(Arr:Array, Index:Number):Array { var temp:Array = []; for (var i:int = 0; i < Arr.length; i++) { if (i != Index) { temp.push(Arr[i]); } } return temp; } public function deleteBy(Arr:Array, Str:String):Array { var temp:Array = []; for (var i:int = 0; i < Arr.length; i++) { if (Arr[i] != Str) { temp.push(Arr[i]); } } return temp; } public function replace(Arr:Array, Search:String, Replace:String):Array { var temp:Array = []; for (var i:int = 0; i < Arr.length; i++) { if (Arr[i] != Search) { temp.push(Arr[i]); }else { temp.push(Replace); } } return temp; } public function count(Arr:Array, Str:String):Number { var n:Number = 0; for (var i:int = 0; i < Arr.length; i++) { if (Arr[i] == Str) { n++; } } return n; } public function sum(Arr:Array):Number { var num:Number; var total:Number = 0; for (var i:int = 0; i < Arr.length; i++) { if (!isNaN(new Number(Arr[i]))) { num = new Number(Arr[i]); }else { num = 0; } total += Arr[i] } return total; } public function group(Arr:Array):Array { var info:Array = []; var memory:Array = []; info[0] = []; info[1] = []; for (var i:int = 0; i < Arr.length; i++) { if (position(memory, Arr[i]) == -1) { memory.push(Arr[i]); info[0].push(Arr[i]); info[1].push(count(Arr, Arr[i])); } } return info; } } }
Veamos en detalle su uso.
Position
¿No les ha pasado que desean saber la posición de un elemento haciendo search? Algo como... Donde esta el código de producto 0019 en mi Array de productos. Para eso es este método:
Código :
var tester:Array = ["Hola","Hola2"]; var wizard:ArrayHelpers = new ArrayHerlpers(); trace(wizard.position(tester,"Hola2");//Output-> 1
Position All
Algo muy similar al método anterior, pero para conocer todas las posiciones de un search.
Código :
var tester:Array = ["Hola","Hola2","Hola"]; var wizard:ArrayHelpers = new ArrayHerlpers(); trace(wizard.positionAll(tester,"Hola");//Output-> 0,2
Delete At
Si estamos controlando Arrays, es posible queramos borrar algo de un lugar en específico.
Código :
var tester:Array = ["Hola","Hola2","Hola"]; var wizard:ArrayHelpers = new ArrayHerlpers(); trace(wizard.deleteAt(tester, 1);//Output-> Hola,Hola
Es útil combinado con los otros métodos también:
Código :
var tester:Array = ["Hola","Hola2","Hola"]; var wizard:ArrayHelpers = new ArrayHerlpers(); trace(wizard.deleteAt(tester, wizard.position(tester,"Hola2"));//Output-> Hola,Hola
Delete By
¿Quieren borrar todos los elementos de un array según un criterio? Es exacto lo que hace esto.
Código :
var tester:Array = ["Hola","Hola2","Hola"]; var wizard:ArrayHelpers = new ArrayHerlpers(); trace(wizard.deleteBy(tester, "Hola");//Output-> Hola2
Replace
Este método es simple, reemplaza un valor dado por otro.
Código :
var tester:Array = ["Hola","Hola2","Hola"]; var wizard:ArrayHelpers = new ArrayHerlpers(); trace(wizard.replace(tester, "Hola","Hola3");//Output-> Hola3,Hola2,Hola3
Count
El count es como un length, pero con un search aplicado. Les permite conocer la cantidad de veces se repite un string en su Array.
Código :
var tester:Array = ["Hola","Hola2","Hola"]; var wizard:ArrayHelpers = new ArrayHerlpers(); trace(wizard.count(tester, "Hola");//Output-> 2
Sum
El Sum les permite sumar todos los elementos númericos del Array. Los demás tipos simplemente los pasará de largo.
Código :
var tester:Array = [5,5,10,"Hola"]; var wizard:ArrayHelpers = new ArrayHerlpers(); trace(wizard.sum(tester);//Output-> 20
Group
Este método les permite devolver un array con solo los elementos no repetidos del Array. Es extremadamente útil trabajando en sistemas de registros múltiples y para contar a los mismos. El Array devuelto es un Array bi-dimensional, conteniendo el Label del Elemento y la Cantidad de Veces estaba presente.
Código :
var tester:Array = ["Hola","Hola2","Hola"]; var wizard:ArrayHelpers = new ArrayHerlpers(); trace(wizard.group(tester[0]);//Output->Hola,Hola2 trace(wizard.group(tester[1]);//Output->2, 1
Espero les sirva!!!
Saludos, Hernán . -
¿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.
Por chaume_loco el 29 de Septiembre de 2010
Por Maikel el 29 de Septiembre de 2010
Opciones para mejorar la clase:
saludos
PD: el código de algunos métodos se pueden optimizar.
Por Maikel el 29 de Septiembre de 2010
saludos
Por Martincho7 el 29 de Septiembre de 2010
Si bien existen mejora como dice @Maikel la clase es muy util.
Si puedo esta semana veo de optimizar y comparto.
Gracias
Martín
Por Héctor el 29 de Septiembre de 2010
1. Varias de esas funciones sí que están en ActionScript.
2. ¿Por qué todos los argumentos y valores devueltos son de tipo String? Así se están forzando conversiones de tipos no siempre válidas o necesarias. En algunas funciones yo pondría como parámetros y para algunas de esas funciones valores de tipo Function, Array, o incluso *.
3. ¿Por qué se importan flash.events.* y flash.net.*? El compilador de AS detecta cuando no es necesario importar realmente las clases, pero aún así tus archivos quedarán mejor si declaras únicamente las clases verdaderamente necesarias.
Por Dano el 29 de Septiembre de 2010
No puedo leer ahora a fondo, ví por ahí un detalle que es considerado "bad practice".
En los fors, no uses Arr.length;
declara una variable como total y asígnale el Arr.length;
En el for usa total.
Saludos
Por M@U el 29 de Septiembre de 2010
Por eldervaz el 30 de Septiembre de 2010
Código :
Siendo el resultado:Código :
Coloqué 300000 en todos los for para que sea un poco notorio.
Un saludo!
Por eldervaz el 30 de Septiembre de 2010
Por bipsa el 30 de Septiembre de 2010
http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/Array.html
Por otro lado en el código, voy a hacer unas modificaciones a un método en tu clase como sugerencia.
Código :
Como puedes ver a 2 cambios, el más importante es el "===" este es simplemente por que no quiero que la validación me diga que "08" cadena es igual a 8 numérico cuando no lo son. El segundo es más también como de lectura de código y buena practica tener un solo return.
Por Hernán el 30 de Septiembre de 2010
chaume_loco :
Maikel :
Código :
Y luego cada vez necesito la extensión hago:Código :
Muuuuuchas veces implemento la clase más a nivel abstracto, una clase para muuuuuchos arrays.Maikel :
Héctor-blog :
Héctor-blog :
Héctor-blog :
eldervaz :
Saludos, Hernán . -
EDIT: olvidaste poner las comillas después del tag quote, por lo que ningún BBcode se renderizo bien después de este. Lo edite porque no se entendía tu comentario y porque podía hacerlo. [/M@U]
Por M@U el 30 de Septiembre de 2010
Código :
La verdad es que quería hacer una demostración similar en cuanto me desocupara pero te me has adelantado, ajajaja. Me apena mi pereza.Y bueno, el hecho de que Vector (cuando está bien destinado) generalmente sea entre cuatro y seis veces más rápido que Array, fue lo que me inspiro a estudiar en qué momentos era más conveniente migrar.
Por BoteRock el 30 de Septiembre de 2010
si algunas funciones devuelven índices, por que establecer el valor de retorno como Number y no como int?
Por Hernán el 30 de Septiembre de 2010
BoteRock-blog :
si algunas funciones devuelven índices, por que establecer el valor de retorno como Number y no como int?
Totalmente de acuerdo. Para mejorar el rendimiento debería usar int como return y Vector para el análisis en vez de Arrays.
Saludos, Hernán . -
Por Otaku RzO el 30 de Septiembre de 2010
Hernán :
BoteRock-blog :
si algunas funciones devuelven índices, por que establecer el valor de retorno como Number y no como int?
Totalmente de acuerdo. Para mejorar el rendimiento debería usar int como return y Vector para el análisis en vez de Arrays.
Saludos, Hernán . -
Retornar int o Number es una diferencia muy muy muy minúscula hablando de rendimiento porque siempre serán números enteros. Pero para esta clase si aplica colocar int porque no esperamos decimales como retorno.
int vs. Number
- Con números enteros gana Integer. (Muy ligeramente)
- Con decimales gana Number.
Math.ceil vs. int() vs. int
Código :
Resultado:
Código :
Personalmente me parece muy estricto tener presente estas buenas practicas para los usos comunes y bucles de pequeños ciclos. Pero para clases reutilizables siempre debemos aplicarlas.
Por Hernán el 30 de Septiembre de 2010
Te paso mis respuestas:
bipsa :
http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/Array.html
Ningún método de la Clase Array esta en mis métodos. Every es cercana a replace pero no funcionan igual, splite no funciona como ninguna de los métodos que hice.
bipsa :
Código :
De acuerdo con el "===", si bien es un String, no confundirá "8" con "08", pero nunca esta de más. Lo que sí, el break o el return son lo mismo, a nivel visual es una preferencia. No estoy en desacuerdo en hacerlo así, pero prefiero ser "más directo" a nivel visual.
Saludos, Hernán . -
Por Hernán el 30 de Septiembre de 2010
Saludos, Hernán . -
Por Otaku RzO el 30 de Septiembre de 2010
Por Hernán el 30 de Septiembre de 2010
Otaku RzO :
Si, no es necesario. Pero cuando hago declaraciones así prefiero usar el "new", es un tema visual y de preferencia mia.
Por lucasmoyano el 30 de Septiembre de 2010
lo que haría falta sería una clase para poder hacer Matrices de manera simple
Por Hernán el 30 de Septiembre de 2010
lucasmoyano-blog :
No entendí la idea. ¿Que tipo de Arrays?
Saludos, Hernán . -
Por Freddie el 30 de Septiembre de 2010
Hernán :
lucasmoyano-blog :
No entendí la idea. ¿Que tipo de Arrays?
Saludos, Hernán . -
Por Hernán el 01 de Octubre de 2010
Freddie :
Hernán :
lucasmoyano-blog :
No entendí la idea. ¿Que tipo de Arrays?
Saludos, Hernán . -
Si está bien... ¿Pero para hacer que? O sea... ¿Cual sería las funciones o métodos que nos faltarían para manejar Arrays BiDimensionales o MultiDimensionales? Más claro, ¿Que objetivo perseguiría la clase?
Lo único se me ocurre, es algo como el tip de Zguillez .
Por Hernán el 01 de Octubre de 2010
PD: Odio que no te deje editar el post !
Por lucasmoyano el 01 de Octubre de 2010
int[,] matriz = new int[100,100];
Seria un array multidimencional de 100x100 slots.
Y después para invocarlo:
matriz[5,1];
Si queres hacerlo en flash, tenes que hacer esto:
var array:Array = new Array();
for (i:int = 0; i < 100; i++)
{
array[i] = new Array();
}
Por Hernán el 02 de Octubre de 2010
lucasmoyano-blog :
int[,] matriz = new int[100,100];
Seria un array multidimencional de 100x100 slots.
Y después para invocarlo:
matriz[5,1];
Si queres hacerlo en flash, tenes que hacer esto:
var array:Array = new Array();
for (i:int = 0; i < 100; i++)
{
array[i] = new Array();
}
Gotcha, si tengo algo de tiempo libre intentaré sentar las bases para una clase para manejar estilo C#. Me parece buena idea.
Saludos, Hernán . -
Por Otaku RzO el 03 de Octubre de 2010
lucasmoyano-blog :
int[,] matriz = new int[100,100];
Seria un array multidimencional de 100x100 slots.
Y después para invocarlo:
matriz[5,1];
Si queres hacerlo en flash, tenes que hacer esto:
var array:Array = new Array();
for (i:int = 0; i < 100; i++)
{
array[i] = new Array();
}
Cree la clase para crear las matrices pero con Vectores para poder indicar el tipo de dato a almacenar. Como es con Vector lo publique en otro tip.
http://foros.cristalab.com/creacion-de-matrices-en-actionscript-3-t91577/
Por lucasmoyano el 04 de Octubre de 2010
Por andy645jh el 12 de Febrero de 2011
Por rickzac el 14 de Junio de 2011
Leí tu tutorial de la clase de Arrays por que deseo filtrar todos los elementos repetidos
de un array, es decir deseo descartar los elementos no repetidos, ya logré hacer lo contrario eliminar los elementos repetidos pero no es lo que deseo, he aqui como lo logré:
Código :
Pero deseo hacer exactaqmente lo contrario...
Alguna ayuda?? Me es super urgente necesito terminar con esto a más tardar mañana.
Gracias.