Posez votre question Signaler

[javascript] Libérer une case de tableau ? [Résolu]

kij_82 4070Messages postés 7 avril 2005Date d'inscription 24 septembre 2010Dernière intervention - Dernière réponse le 18 août 2009 à 16:33
Bonjour,
Je voudrais savoir comment libérer une case d'un tableau en javascript, quelqun saurait-il faire ca ?
Par exemple, le tableau suivant :
<code>
var tab = new Array;
tab["popo"] = 1;
tab["tutu"] = 56;
...
/code>
Comment libérer la case "tutu" par exemple afin que la taille du tableau soit décrémentée automatiquement ?
Merci :)
Lire la suite 

[javascript] Libérer une case de tableau »

14 réponses
Réponse
+5
moins plus
si l'ordre des éléments du tableau n'est pas important, on peut remplacer l'élément à supprimer par le dernier élément du tableau et ensuite on fait un pop.

for(i=0;i<tab.length;i++)
if(tab[i]==nom)
{
tab[i]=tab[tab.length-1];
tab.pop();
break;
}
Ajouter un commentaire
Réponse
+0
moins plus
tu peux utiliser l'algorithme qui consiste à décaler à gauche les éléments du tableau et à la fin du décalage tu donne à la valeur N(taille du tableau)=N-1;
Ajouter un commentaire
Réponse
+0
moins plus
Mum, oui, mais si je pouvais avoir une autre altenative que ca ca m'arrangerais ^^

PS : je précise que la méthode splice de l'objet Array ne fonctionne pas car elle se contente de remplacer la valeur de la case à supprimer par null. Donc la case est toujours là, la taille ne décrémente pas et une case ne référence plus rien, ce qui pose des problemes lors du parcours du tableau.
slum-dunk - 15 déc. 2006 à 11:07
keski te géne c'est l'implementation de l'algo ou j'ai pas été claire sur l'explication?
Ajouter un commentaire
Réponse
+0
moins plus
Haaa !!

J'ai trouvé mon bonheur : l'opérateur 'delete' de javascript permet cela

voir la page suivante pour les intéressés :
http://developer.mozilla.org/...

Merci :)
kij_82 - 15 déc. 2006 à 11:31
Bon, il s'avère que l'option delete n'est pas si bien que ca en fait, donc j'ai finalement opté pour une fonction maison reprenant effectiviment l'idée de décalage, voici donc le code :
function freeBox ( lib ){
		
		var tmpArray = new Array();
		
		// --- Rebuild the array
		for ( var i = 0; i < this.box_list.lenght; i++ )
			if ( this.box_list[i].lib != lib )
				tmpArray[tmpArray.lenght] = this.box_list[i];
		
		// --- And set it to the boxlist of map
		this.box_list = tmpArray;
}


Mon tableau est une liste d'objet, d'ou l'acces à la propriété 'lib'.

Merci pour cette idée slum.

slum-dunk - 15 déc. 2006 à 12:15
voila l' algo.,tu tester à la main pour voir comment ça fonctionne

procédure dcg(données:tab(n):tableau d'objet,n:entier,k:entier)
//n est la taille du tableau
//k c'est la position de l'objet à supprimer dans ton tableau
var i:entier
début

pour i de k à n faire
{
tab(i)=tab(i+1);
}
n=n-1;

fin dcg

//dcg :décalage cyclique à gauche
slum-dunkkij_82 - 15 déc. 2006 à 17:26
Bonsoir Kij_82,tu en est ou??
Ajouter un commentaire
Réponse
+0
moins plus
Salut kij_82 je crois que tu pourrais améliorer ton algo en terme de vitesse.

Sur ton prog tu recrée entièrement ton tableau, alors qu'il suffit juste de faire remonter les élements suivant la case à supprimer. A la fin de ton tableau il te restera une case en trop : tu peux la supprimer en faisant : tonTablo.pop();

Et voilà j'espère t'avoir rendu service (même si le sujet en bien vieux!).
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

Effectivement le sujet est bien vieux et j'ai du oublié de le mettre à jour :s
A l'époque j'ai effectivement refais le programme pour ne pas recréer à chaque fois.

Merci en tout cas de ton aide :)
ddez - 6 août 2008 à 18:35
Bonjour à tous,

Je viens de me prendre la tête un bon moment sur ce problème aussi et je viens de me rendre compte d'un truc :

Lorsque l'on code ceci :
 var tab = new Array();
 tab["popo"] = 1;
 tab["tutu"] = 56;
 tab["tata"] = 57;
 tab["titi"] = 58;
En réalité, on ajoute aucun élément dans la liste car
 alert(tab.length); //affiche 0
En réalité, on ajoute des paramètres à cette liste. On peut d'ailleurs récupérer ces valeurs de la manière suivante :
 alert(tab.tutu); //affiche 56
Et ces paramètres sont effaçable par la commande "delete"
 delete(tab["tutu"]);

 for(var i in tab){
    document.write('tab["'+i+'"] = '+tab[i]+';<br>');
 }
 //affiche
 //tab["popo"] = 1;
 //tab["tata"] = 57;
 //tab["titi"] = 58;
En revenche, si on utilise les listes "normalement" (sans utiliser d'indices textuels), on peut utiliser la fonction suivante :
 remove=function(){
   var _temp=arguments[0].splice(0,arguments[1]);
   arguments[0].shift();
   arguments[0].unshift(_temp);
 };

 var tab=new Array(1,56,57,58);

 alert(tab); //affiche 1,56,57,58
 remove(tab,1);
 alert(tab); //affiche 1,57,58
Alors qu'un delete ne supprime pas réellement l'élément :
 var tab=new Array(1,56,57,58);

 alert(tab); //affiche 1,56,57,58
 delete(tab[1]);
 alert(tab); //affiche 1,,57,58

Voila voila.
J'espère que ca en aidera quelques uns.

Bon code ...
ddez - 6 août 2008 à 19:44
Ha oui, juste un détail pour la fonction remove (ca marchait pas avec l'indice 0) :
 remove=function(){
   if(arguments[1]>0){
     var _temp=arguments[0].splice(0,arguments[1]);
     arguments[0].shift();
     arguments[0].unshift(_temp);
   }
   else{
     arguments[0].shift();
   }
 };
ddezddez - 7 août 2008 à 00:20
Désolé mais encore une correction car le résultat n'était pas exactement celui attendu (malgré l'affichage du alert).
Maintenant c'est bon, c'est sur :
 remove=function(){
   if(arguments[1]>0){
     var _temp=arguments[0].splice(0,arguments[1]);
     arguments[0].shift();
     while(_temp.length>0){
        arguments[0].unshift(_temp.pop());
     }
   }
   else{
     arguments[0].shift();
   }
 };

Encore désolé pour ces posts avec de mauvais codes...
Ajouter un commentaire
Ce document intitulé « [javascript] Libérer une case de tableau ? » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Windows 8 - À quoi s'attendre ?