Si vous faites un peu de programmation Flash en AS3, vous aurez remarqué que la classe Array, certes bien fournie, n'est pas parfaite : certaines opérations de base ne sont pas intégrées dedans, ce qui oblige à recoder à chaque fois des fonctionnalités aussi simples que la suppression d'un élément ou son clonage.

En fait, on peut faire mieux : en créant une classe qui hérite de Array, on peut ajouter toutes les méthodes nécessaires. La seule restriction étant qu'on ne peut plus utiliser la syntaxe des crochets pour déclarer un nouvel élément (comme [1,2,3]).
Dans mon cas j'ai nommé cette classe ArrayPlus, le code est juste en-dessous.

Fonctionnalité d'ArrayPlus :

  • Reprise de la quasi totalité des fonctions de la classe Array de base ;
  • uniquePush(item:*):void : ajoute un item uniquement s'il n'est pas déjà présent dans le tableau ;
  • clone():ArrayPlus : renvoie une copie de l'objet. Attention, seul le tableau est cloné, pas le contenu des cellules qui continuent de pointer vers le même objet ;
  • contains(item:*):Boolean : renvoie true si l'objet passé en paramètre se trouve dans le tableau ;
  • remove(item:*):void : la fonction la plus utile ! Supprime l'objet du tableau, lance une erreur s'il n'existe pas ;
  • replace(search:*,replace:*):void : remplace la première occurrence de search par replace. Si search n'est pas trouvé, une erreur est générée.
  • swap(item:*,item2:*) : inverse la position de deux éléments dans le tableau ;
  • static concat(a:ArrayPlus,b:ArrayPlus):ArrayPlus : renvoie un ArrayPlus composé de l'intégralité des éléments de a et de b ;
  • static dictionary2Array(d:DictionaryPlus):ArrayPlus : transforme un ArrayPlus en DictionaryPlus. Si vous n'utilisez pas DictionaryPlus, vous pouvez le remplacer par un simple Dictionary.

ArrayPlus.as

/**
 * ARRAYPLUS || Neamar
 * La classe ArrayPlus tente de pallier aux déficits de la classe Array interne à ActionScript.
 * Elle apporte plusieurs méthodes utiles, parmi lesquelles :
 * - uniquePush qui insère l'élément s'il n'est pas encore dans le tableau.
 * - clone qui renvoie un clone de l'objet ;
 * - contains qui vaut true si l'item spécifié en paramètre est présent dans le tableau
 * - remove supprimer l'élement
 * - swap échange l'ordre de deux élements
 * 
 * Cette classe présente l'avantage d'être assez similaire à DictionaryPlus, permettant d'échanger de façon transparente les deux types de données selon les besoins.
 * 
 * MÉTHODES STATIQUE :
 * - concat : renvoie la concaténation des deux tableaux passés en paramètres.
 * - Dictionary2Array : transforme un DictionaryPlus en ArrayPlus. Attention, il y a perte d'informations !
*/

package Utilitaires
{
	public dynamic class ArrayPlus extends Array
	{
		/**
		 * Crée un nouveau ArrayPlus à partir des paramètres.
		 * @param ... Liste d'items à enregistrer
		 */
		public function ArrayPlus(... Items)
		{
			for each(var Item:* in Items)
				this.push(Item);
		}

		/**
		 * Ajoute un élément de façon unique dans le tableau.
		 * @param item L'élément à ajouter s'il n'es tpas déjà présent
		 */
		public function uniquePush(item:*):void
		{
			if(!this.contains(item))
				this.push(item);
		}

		/**
		 * Clone l'objet et renvoie une nouvelle occurrence d'ArrayPlus avec un contenu identique.
		 * @return Le clone de l'objet
		 */
		public function clone():ArrayPlus
		{
			var Bis:ArrayPlus=new ArrayPlus();
			for each(var i:* in this)
				Bis.push(i);

			return Bis;
		}

		/**
		 * Filtrer une partie des éléments du tableau selon une fonction de Callback.
		 * @param Callback Une fonction qui renvoie true si l'élément doit figurer dans le nouveau tableau, false sinon.
		 * @return Le tableau avec tous les éléments pour lesquels Callback vaut true.
		 */
		public function filtrer(Callback:Function):ArrayPlus
		{
			var Retour:ArrayPlus=new ArrayPlus();
			for each(var item:* in this)
			{
				if(Callback.call(this,item))
					Retour.push(item);
			}
			return Retour;
		}

		/**
		 * Déterminer si un élément appartient au tableau.
		 * @param item L'élement à tester
		 * @return true si présent, false sinon
		 */
		public function contains(item:*):Boolean
		{
			return (this.indexOf(item)!=-1)
		}

		/**
		 * Supprime un élément du tableau. Attention, ne le supprime qu'une fois s'il est présent en doublons ! Si l'élément n'est pas présent, une erreur est lancée.
		 * @param item L'élément à supprimer.
		 */
		public function remove(item:*):void
		{
			var id:int=this.indexOf(item);
			if(id!=-1)
				this.splice(id,1);
			else
				throw new Error("Suppression d'un item inexistant");
		}

		/**
		 * Remplace une occurrence d'un élément par un autre élément.
		 * @param search Élément à chercher
		 * @param replace Élément de remplacement
		 */
		public function replace(search:*,replace:*):void
		{
			var id:int=this.indexOf(search);
			if(id!=-1)
				this.splice(id,1,replace);
			else
				throw new Error("Remplacement d'un item inexistant");
		}

		/**
		 * Inverse la position de item avec la position de item2
		 * @param item Premier élément
		 * @param item2 Second élément
		 */
		public function swap(item:*,item2:*):void
		{
			var switcher:Object=new Object();
			replace(item,switcher);
			replace(item2,item);
			replace(switcher,item);
		}

		/**
		 * Renvoie tous les éléments contenus dans le tableau sous forme de String
		 * @return Liste concaténée par des sauts de ligne des éléments du tableau
		 */
		public function toString():String
		{
		var S:String="";
		for each(var item:* in this)
			S += item.toString() + "\n";
		return S;
		}


//STATIQUE

		/**
		 * Concatène les deux tableaux passés en paramètre et renvoie le résultat.
		 * @param a Le premier ArrayPlus
		 * @param b Le second ArrayPlus
		 * @return L'ArrayPlus contenant tous les éléments de a et de b.
		 */
		public static function concat(a:ArrayPlus,b:ArrayPlus):ArrayPlus
		{
			var retour:ArrayPlus=a.clone();
			for each(var items:* in b)
				retour.push(items);
			return retour;
		}

		/**
		 * Transforme un dictionnaire en Array. Attention, on perd de l'information (le nom de la clé)
		 * @param d Le dictionnaire à traduire en ArrayPlus
		 * @return L'ArrayPlus résultant de la traduction
		 */
		public static function dictionary2Array(d:DictionaryPlus):ArrayPlus
		{
			var Tableau:ArrayPlus=new ArrayPlus();
			for(var i:* in d)
				Tableau.push(d[i]);

			return Tableau;
		}
	}
}