begin process at 2010 03 15 04:56:04
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Trucs & Astuces

 > DIVERSES FONCTIONS SIMPLES POUR LES TABLEAUX

DIVERSES FONCTIONS SIMPLES POUR LES TABLEAUX


 Information sur la source

Note :
9,33 / 10 - par 3 personnes
9,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Trucs & Astuces Classé sous :bibliothèque, library, tableau, array, javascript Niveau :Initié Date de création :03/06/2005 Date de mise à jour :25/04/2007 09:16:40 Vu / téléchargé :15 164 / 322

Auteur : Gorrk

Ecrire un message privé
Site perso
Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

 Description

Quelques petites fonctions qui peuvent être utiles sur les tableaux.

Source

  • /**
  • * Bibliothèques de fonctions pour tableaux.
  • *
  • * @author Julien Fontanet
  • * @date 2007-04-25
  • * @version 0.4.4
  • **/
  • /**
  • * Vérifie si une variable est un tableau.
  • *
  • * @param mixed variable La variable à vérifier.
  • * @return boolean true si variable est un tableau, false sinon.
  • **/
  • function isArray(variable)
  • {
  • return variable instanceof Array;
  • }
  • /**
  • * Compare le tableau avec une variable de façon non récursive.
  • *
  • * @param mixed variable La variable à comparer avec le tableau.
  • * @return boolean true si ils sont égaux, false sinon.
  • **/
  • Array.prototype.compare = function (variable)
  • {
  • if (!isArray(variable))
  • {
  • return false;
  • }
  • var len = this.length;
  • if (variable.length != len)
  • {
  • return false;
  • }
  • var i = 0;
  • while (i < len && this[i] == variable[i])
  • {
  • ++i;
  • }
  • return i == len;
  • }
  • /**
  • * Filtre un tableau.
  • *
  • * Filtre un tableau à partir d'une fonction si elle est définie, efface les
  • * membres assimilables à false sinon.
  • *
  • * @param mixed callBack La fonction à utiliser pur le filtrage.
  • * @param boolean recursive true pour la récursivité.
  • * @return Array Tableau filtré.
  • **/
  • Array.prototype.filter = function (callBack, recursive)
  • {
  • if (typeof callBack != "function")
  • {
  • callBack = function(value)
  • {
  • return Boolean(value) && (!isArray(value) || value.length != 0);
  • }
  • }
  • if (typeof recursive != "boolean")
  • {
  • recursive = Boolean(recursive);
  • }
  • var
  • i = 0,
  • len = this.length,
  • result = new Array(),
  • buffer;
  • while (i < len)
  • {
  • buffer = this[i];
  • if (recursive && isArray(buffer))
  • {
  • buffer = buffer.filter(callBack, recursive);
  • }
  • if (callBack(buffer))
  • {
  • result.push(buffer);
  • }
  • ++i;
  • }
  • return result;
  • }
  • /**
  • * Vérifie si une valeur est présente dans le tableau.
  • *
  • * @param mixed value La valeur à trouver.
  • * @param boolean recursive true pour la récursivité.
  • * @return boolean true si la valeur a été trouvé, false sinon.
  • **/
  • Array.prototype.inArray = function (value, recursive)
  • {
  • var i, current;
  • if (typeof recursive != "boolean")
  • {
  • recursive = Boolean(recursive);
  • }
  • for (i = 0; i < this.length; ++i)
  • {
  • current = this[i];
  • if (isArray(current) && recursive && current.inArray(value, recursive))
  • {
  • return true;
  • }
  • if (current == value)
  • {
  • return true;
  • }
  • }
  • return false;
  • }
  • /**
  • * Convertit le tableau en chaîne.
  • *
  • * @return String Le tableau sous forme de chaîne.
  • **/
  • Array.prototype.toString = function ()
  • {
  • var
  • i = 0,
  • len = this.length,
  • buffer = new Array(len);
  • while (i < len)
  • {
  • if ((this[i] instanceof String) || (typeof this[i] == "string"))
  • {
  • buffer[i] = '"' + this[i] + '"';
  • }
  • else
  • {
  • if (isArray(this[i]))
  • {
  • buffer[i] = this[i].toString();
  • }
  • else
  • {
  • buffer[i] = this[i];
  • }
  • }
  • ++i;
  • }
  • return "Array(" + len + ") {" + buffer.join(", ") + "}";
  • }
/**
 * Bibliothèques de fonctions pour tableaux.
 *
 * @author Julien Fontanet
 * @date 2007-04-25
 * @version 0.4.4
 **/

/**
 * Vérifie si une variable est un tableau.
 *
 * @param mixed variable La variable à vérifier.
 * @return boolean true si variable est un tableau, false sinon.
 **/
function isArray(variable)
{
	return variable instanceof Array;
}

/**
 * Compare le tableau avec une variable de façon non récursive.
 *
 * @param mixed variable La variable à comparer avec le tableau.
 * @return boolean true si ils sont égaux, false sinon.
 **/
Array.prototype.compare = function (variable)
{
	if (!isArray(variable))
	{
		return false;
	}
	var len = this.length;
	if (variable.length != len)
	{
		return false;
	}
	var i = 0;
	while (i < len && this[i] == variable[i])
	{
		++i;
	}
	return i == len;
}

/**
 * Filtre un tableau.
 *
 * Filtre un tableau à partir d'une fonction si elle est définie, efface les
 * membres assimilables à false sinon.
 *
 * @param mixed callBack La fonction à utiliser pur le filtrage.
 * @param boolean recursive true pour la récursivité.
 * @return Array Tableau filtré.
 **/
Array.prototype.filter = function (callBack, recursive)
{
	if (typeof callBack != "function")
	{
		callBack = function(value)
		{
			return Boolean(value) && (!isArray(value) || value.length != 0);
		}
	}
	if (typeof recursive != "boolean")
	{
		recursive = Boolean(recursive);
	}
	var
		i = 0,
		len = this.length,
		result = new Array(),
		buffer;
	while (i < len)
	{
		buffer = this[i];
		if (recursive && isArray(buffer))
		{
			buffer = buffer.filter(callBack, recursive);
		}
		if (callBack(buffer))
		{
			result.push(buffer);
		}
		++i;
	}
	return result;
}

/**
 * Vérifie si une valeur est présente dans le tableau.
 *
 * @param mixed value La valeur à trouver.
 * @param boolean recursive true pour la récursivité.
 * @return boolean true si la valeur a été trouvé, false sinon.
 **/
Array.prototype.inArray = function (value, recursive)
{
	var i, current;
	if (typeof recursive != "boolean")
	{
		recursive = Boolean(recursive);
	}
	for (i = 0; i < this.length; ++i)
	{
		current = this[i];
		if (isArray(current) && recursive && current.inArray(value, recursive))
		{
			return true;
		}
		if (current == value)
		{
			return true;
		}
	}
	return false;
}

/**
 * Convertit le tableau en chaîne.
 *
 * @return String Le tableau sous forme de chaîne.
 **/
Array.prototype.toString = function ()
{
	var
		i = 0,
		len = this.length,
		buffer = new Array(len);
	while (i < len)
	{
		if ((this[i] instanceof String) || (typeof this[i] == "string"))
		{
			buffer[i] = '"' + this[i] + '"';
		}
		else
		{
			if (isArray(this[i]))
			{
				buffer[i] = this[i].toString();
			}
			else
			{
				buffer[i] = this[i];
			}
		}
		++i;
	}
	return "Array(" + len + ") {" + buffer.join(", ") + "}";
}

 Conclusion

Si vous avez d'autres idées de fonctions simples, car je cherche à faire des fonctions de base aisément réutilisables, n'hésitez pas à m'en faire part.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

04 juin 2005 14:26:01 :
Rien de spécial, simple ajout du zip.
05 juin 2005 21:45:34 :
Remplacement de la fonction clean par la fonction filter qui permet de filtrer le tableau grace à une fonction, ou d'obtenir le fonctionnement de clean sinon, voir le manuel php (array_filter).
01 juin 2006 18:36:16 :
Optimisation de toutes les fonctions, moins d'utilisation de variables, des algorithmes légèrements optimisés. Je laisse l'ancienne version dans le zip (ol.array.js)
21 avril 2007 15:34:34 :
Ajout des commentaires style JavaDoc, simplification de la fonction isArray() et optimisation du code de compare() (non testé, si il y a un problème, faites le moi savoir).
21 avril 2007 16:20:17 :
Pendant que j'y étais, j'en ai profité pour optimiser aussi filter() et toString().
25 avril 2007 09:16:40 :
Corrections mineures dans filter() et inArray().

 Sources du même auteur

BOUT DE CODE POUR XMLHTTPREQUEST
Source avec Zip OUTILS D'ADMINISTRATION DE WINDOWS (HTML APPLICATION) V1.1
PARCOURIR À LA RECHERCHE D'UN FICHIER
FONCTIONS COMPLEMENTAIRES POUR LES DATES
3 PETITES FONCTIONS DOM POUR LES NAVIGATEURS QUI NE LES PREN...

 Sources de la même categorie

ACCÈS À LA MÉTHODE SETATTRIBUTE('STYLE','') SOUS IE6 par masternico
OUTIL DE SÉLECTION par jdmcreator
Source avec Zip SIMPLIFIER LA CREATION DYNAMIQUE D'ELEMENT HTML par kazma
DÉTECTER SI CSS EST ACTIVÉ par jdmcreator
RETROUVER LE NUMÉROS DE TELEPHONE DE VOTRE EMPLOYER RAPIDEME... par rappise

 Sources en rapport avec celle ci

DÉSACTIVER UN BOUTON SUBMIT APRÈS ENVOI DU FORMULAIRE par SoftDeath
AFFICHER OU CACHER UN COMPOSANT AVEC JAVASCRIPT V1.0 par xloadx
CHRONOMÉTRE EN JAVASCRIPT par simo5963
TRANSFORMER UN TABLEAU JAVASCRIPT EN UN TABLEAU HTML par pifou25
CONTROLER LE NOMBRE DE CHECKBOX CLIQUEES par Samiby

Commentaires et avis

Commentaire de LocalStone le 03/06/2005 18:46:54

Salut,
Bon, ça va faire un peu péteux, mais j'avais déjà réalisé de tels ajout à la classe Array en Javascript. Donc c'est vraiment une bonne idée d'avoir poster une telle source sur le réseau. Le mot-clef "prototype" est très utile pour ajouter ses propres méthodes et peu connu de néophytes (ça le fait ce mot, non ?). Donc bravo ! 9/10 !
L.S.
++ !

Commentaire de Gorrk le 04/06/2005 14:44:18

9/10, Waou, je ne sais pas si ça le valait, mais en tous cas merci.

P.S. : oui, tu as raison, le mot néophyte est assez sympa, mais personnellement, dans un autre style bien sur, je prefère le mot archétype, mdr.

Commentaire de darkman2 le 04/06/2005 16:48:33

moi je te donne une nte de 10/10
ca se voit k s'est vraimen utile ton script

Commentaire de Gorrk le 04/06/2005 17:21:32

Ca c'est sympa, 10/10, moi-même je crois que je n'aurait mis que 8, mdr, mais ce serait en core plus sympa si tu n'avais pas oublier de noter, lol...

Bon, à part mettre des notes, n'auriez vous pas d'autres idées de fonctions simples sur les tableaux ?!

Commentaire de Gorrk le 04/06/2005 17:23:35

Ah, ben autant pour moi, c'était un simple problème de cache dans mon navigateur...

Commentaire de Gorrk le 05/06/2005 21:06:11

Bon, ben puisque personne n'as d'idées, je vais m'inspirer des fonctions PHP.

Commentaire de Gorrk le 01/06/2006 18:40:04

Mise à jour : optimisation du code.

J'appelle toujours à des idées de fonctions intéressantes.

De même pour une bibliothèque sur les chaînes que je viens de commencer.

Commentaire de Gorrk le 21/04/2007 16:30:40

Bon, je suis passé par là et j'ai un peu amélioré le code, autant les algorithmes que la propreté de l'écriture, comme ça, les débutants (et les cochons ;) ) pourront voir a quoi ressemble un code simple et propre.

Un truc très important quant-à l'optimisation du code c'est la propreté des boucles : mettre un minimum d'instruction continue, mais surtout break et return dans ses boucles est un bon moyen, préférez les tests dans la condition de la boucle (cf. la fonction compare()).

Voilà, bonne continuation à tous.

Commentaire de ludovicanceaux le 07/08/2007 16:42:12

bjr, je trouve ton morceau de code très interressent (mais il manque la fonction que je recherche lol), (je sais que je ne suis pas sur le forum, mais peut être que tu saurais comment peut t'on procéder pour trier un tableau multidimensionnel (le mien n'a que 2 colonnes) par la deuxième colonne par exemple. car en fait j'ai une fonction qui insère récursivement au load des données
function add_array(url_garage,marque,modele,categorie,couleur,kilometrage,interieur,millesime,immat,option,prix_ttc,photo){
var id=fiches_array.length;
fiches_array[id]=new Array();
fiches_array[id][1]=marque;
fiches_array[id][2]=modele;
fiches_array[id][3]=categorie;
fiches_array[id][4]=kilometrage;
fiches_array[id][5]=couleur;
fiches_array[id][6]=interieur;
fiches_array[id][7]=option;
fiches_array[id][8]=prix_ttc;
fiches_array[id][9]=photo;
fiches_array[id][10]=immat;
}
et en fait je voudrais trier par marque ou bien par modele, j'ai essayé fiches_array.sort();, ca me trie par rapport à la 1ère colonne, mais je peux pas trier par rapport aux autres. merci bcp

Commentaire de Gorrk le 08/08/2007 11:12:16

Salut, ben en fait, j'ai pas trop le temps de m'en occuper pour le moment, je suis actuellement en vacances et je n'ai que peu accès à internet mais je suis sûr que quelqu'un va se dévouer ;) .

Sinon, renseigne toi sur les algorithmes de tri comme le tri à bulles par exemple.

Promis, je l'intègrerai dans ma bibliothèque, d'ici deux semaines je pense.

Commentaire de Gorrk le 08/09/2007 17:23:03

Salut, désolé de ne pas avoir répondu plus tôt (j'ai eu plein de choses à faire récemment et je suis en plein déménagement). Alors en fait c'est très simple (si j'ai bien compris la problématique) : il faut effectivement utiliser la fonction de trie native de JavaScript (sort), mais il faut lui passer en argument une fonction de comparaison, sinon, les éléments seront convertis en chaînes et rangé selon l'ordre lexicographique (cf. http://developer.mozilla.org/fr/docs/R%C3%A9f%C3%A9rence_de_JavaScript_1.5_Core:Objets_globaux:Array:sort) :

function comparerMarque(fiche_1, fiche_2)
{
  if (fiche_1[1] < fiche_2[1])
    return -1;
  else if (fiche_1[1] == fiche_2[1])
    return 0;
  else
    return 1;
}

function comparerModele(fiche_1, fiche_2)
{
  if (fiche_1[2] < fiche_2[2])
    return -1;
  else if (fiche_1[2] == fiche_2[2])
    return 0;
  else
    return 1;
}

var fiches_triees_par_marques = fiches_array.sort(comparerMarque);
var fiches_triees_par_modeles = fiches_array.sort(comparerModele);

Voilà, c'est aussi simple que ça, il est inutile que j'intègre la fonction de trie dans la bibliothèque vu qu'elle existe déjà dans le standard JavaScript (à partir de 1.1).
Sinon, deux petites choses : la numérotations des éléments des tableaux en JavaScript commence à 0 et pas à 1 (tes fiches actuelles occupent 11 cases en mémoires pour 10 utilisées) et tu pourrais utiliser des objets au lieu des tableaux pour tes fiches, ce serait plus simple :
function Voiture(url_garage, marque, modele, categorie, couleur, kilometrage, interieur, millesime, immat, option, prix_ttc, photo)
{
  this.url_garage = ;
  this.marque =  marque;
  this.modele = modele;
  this.categorie = categorie;
  this.couleur = couleur;
  this.kilometrage = kilometrage;
  this.interieur = interieur;
  this.millesime = millesime;
  this.immat = immat;
  this.option = option;
  this.prix_ttc = prix_ttc;
  this.photo = photo;
}
voiture_1 = new Voiture(....);

Cela permet de simplifier l'accès aux propriétés de la voiture (par les noms et non plus par des indexes numériques). Voir : http://developer.mozilla.org/fr/docs/R%C3%A9f%C3%A9rence_de_JavaScript_1.5_Core:Op%C3%A9rateurs:Op%C3%A9rateurs_sp%C3%A9ciaux:L%27op%C3%A9rateur_new

Bonne continuation.

Commentaire de pifou25 le 30/11/2007 10:54:14

salut,
tout simplement énorme l'utilisation des prototypes, on se demande pourquoi ces fonctions sont pas natives dans JS! J'ai modifié la fonction toString pour prendre en compte les tableaux associatifs (avec les clés), pour avoir un résultat genre:
Array(7) {'0'=1, '1'=2, '2'=Array(4) {'0'=4, '1'=5, '2'=6, '3'=7}, '6'=33, 'x'="toto x", 'z'="toto yy", 'y'="toto zzz"}

voici le code pour cela, OK sur FF2 et IE7.: (utilise for (var i in this))
Array.prototype.toString = function ()
{
var buffer='', len=0;
for (var i in this)
{
if ((i instanceof String) || (typeof i == "string"))
buffer+=", '"+i+"'=";
else
buffer+=', '+i+'=';
if ((this[i] instanceof String) || (typeof this[i] == "string"))
buffer += '"' + this[i] + '"';
else if (isArray(this[i]))
buffer += this[i].toString();
else
buffer += this[i];
len++;
}
return "Array(" + len + ") {" + buffer.substring(2) + "}";
}

cado, ajoute le dans cette classe ;)

Commentaire de Gorrk le 30/11/2007 12:40:12

Salut, merci ton commentaire, mais moi je trouve que qu'il est mieux que ces fonctions ne soit pas natives : je suis plutôt partisan de langages très simple avec un minimum de fonctions prédéfinies car il y a tellement de besoins différents que quand on commence à incorporer de fonctions on ne s'arrête jamais. Je préfère que toutes ces fonctions soient rangées dans des bibliothèques séparées (du genre à la Python).

Quoi qu'il en soit, très bonne idée ta fonction, mais ça marche ? Parce qu'il me semblait que les tableaux associatifs n'étaient que des objets et pas des tableaux, cela signifierait qu'elle ne fonctionnerait pas avec le Array.prototype. Mais si ça marche je l'intègrerai dans la bibliothèque (la semaine prochaine probablement, j'ai plein de trucs à faire en ce moment).

Commentaire de pifou25 le 30/11/2007 13:14:08

Comme je te le dis ;) testé sur FF2 et IE7 (j'ai pas cherché plus loin)
Pour la théorie, il me semble que le Array est lui même un objet et aussi que depuis une certaine version de JS on peut parcourir les propriétés/méthodes des objets comme on le fait des valeurs/clés d'un tableau -et vice versa-

Commentaire de Gorrk le 01/12/2007 18:43:32

Bon, j'ai un peu cherché et il semble que les tableaux associatifs n'existent pas : quand on utilise des propriétés nommées ce sont des propriétés associées à l'objet et non pas à Array (c.f. http://www.andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/, via http://developer.mozilla.org/fr/docs/R%C3%A9f%C3%A9rence_de_JavaScript_1.5_Core:Objets_globaux:Array#Description).

Donc si on veut l'implémenter, il faudrait le faire comme prototype de Object, donc pas dans une bibliothèque pour les Array.

Sinon pour la petite histoire, la fonction toString() existe déjà, je ne fais que la surcharger pour rendre l'affichage plus joli et pour pouvoir faire un eval dessus.

En tous cas, merci pour ta participation : tu pourrais commencer une bibliothèque sur les Object. On pourra peut-être fusionner un jour nos deux bibliothèques qui sait. Même si je doute que l'on puisse concurencer les bibliothèques existantes comme JQuery ou Prototype.

Commentaire de pifou25 le 05/12/2007 09:52:06

Je ne vois pas trop l'utilité d'une bibliothèque Objet, je ne sais pas ce qu'on pourrait y ajouter? chaque objet est particulier, je ne vois pas trop ce que pourrait donner la propriété toString sur un objet d'ailleurs...

Commentaire de Gorrk le 05/12/2007 12:51:12

À la réflexion, tu as raison, en dehors de la fonction toString, je ne vois pas trop ce que l'on pourrais mettre dans une bibliothèque pour les objets... Peut-être une fonction de copie de propriétés depuis un autre Object (il me semble que la plupart des frameworks JavaScript font ça pour implémenter l'héritage) ?

Mais c'était surtout pour dire que la fonction que tu as proposée ne parcours pas les entrées d'un tableau mais les propriétés de l'objet, donc que sémentiquement je ne pouvais pas (voulais pas) la mettre dans ma bibliothèque.

Mais si ça ne t'intéresse pas de faire une bibliothèque Object, peut-être la ferais-je.

Commentaire de pifou25 le 06/12/2007 10:50:44

J'avoue que la sémantique me laisse perplexe... si j'en avais besoin je le ferais volontier, mais la, juste pour les beaux yeux de la sémantique, je te laisse volontier le bébé :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

La porté d'un array en javascript [ par maxxcbenny ] Bonjour,Comment faire pour passer un tableau de type array dans une fonction en javascript ?Parce que voici ce que j'ai codé :&lt;script language="Jav Bug avec array::length [ par Checker_Bobby ] Bonjour, je savais pas trop ou mettre la remarque suivante... J'ai constater un truc "bizarre" avec JavaScript qui m'a bien tordu l'esprit avant que j Transfert variable asp -> javascript [ par nounours21_6 ] Bonjour,j'ai un&nbsp; petit probl&#232;me de transfert de&nbsp;tableau de asp&nbsp;vers javascript...je n'arrive pas a r&#233;cup&#233;rer le tableau Création d'un Tableau en Javascript [ par vdzh ] Voici ce que j'ai écrit :&lt;html&gt;&lt;head&gt;&lt;script language = "JavaScript"&gt;&lt;!-- var url = ""; var NbLig = 9; Passage d'un tableau javascript en parametre d'une URL ? [ par scoubigee ] G un tableau javascript obtenu grace &#224; un formulaire que je veux envoyer a une nouvelle page, est-il possible d'envoyer ce tableau en parametre d Compatibilité PHP/Javascript [ par gregalex ] Je veux utiliser une tableau de champs de type "input".Pour cela, en php, je dois les d&#233;clarer en name="nomduchamp[]".les crochets permettent de Redimensionnement de tableaux sous javascript/netscape [ par Blasteur ] Bonjour à tous!Je souhaite redimensionner dynamiquement un tableau (du nom de 'CESSION') grâce à une fonction javascript.Le problème c'est que le code Tableau dynamique asp + controle bt radio javascript [ par ROM105 ] Bonjour je réalise actuellement une application pour mon stage afin de rechercher et réserver un bouquin et j apprends à manipuler asp + javascript.J' tableau scrollbar [ par beuchum ] Bonjour, Je suis en train de créer mon site perso. Je suis à la recherche d'un script (javascript), si possible qui fonctionne sous (IE, Netscape, Ope Checkbox avec PHP/MySQL/JavaScript [ par montalto ] Bonjour,Je suis debutant dans la programmation web et j'aurais besoin d'aide, ou pluto de sources ;)voila je doit faire une page qui affiche un tablea


Nos sponsors


Appels d'offres

Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales