[javascript] Libérer une case de tableau ?
Résolu/Fermé
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
-
15 déc. 2006 à 10:55
zero - 18 août 2009 à 16:33
zero - 18 août 2009 à 16:33
A voir également:
- [javascript] Libérer une case de tableau ?
- Tableau croisé dynamique - Guide
- Comment liberer de l'espace sur gmail - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Comment libérer de l'espace de stockage sans rien supprimer - Accueil - Guide Android
6 réponses
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;
}
for(i=0;i<tab.length;i++)
if(tab[i]==nom)
{
tab[i]=tab[tab.length-1];
tab.pop();
break;
}
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;
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
15 déc. 2006 à 11:04
15 déc. 2006 à 11:04
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.
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.
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
15 déc. 2006 à 11:06
15 déc. 2006 à 11:06
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/fr/docs/Guide_JavaScript_1.5:Op%C3%A9rateurs:Op%C3%A9rateurs_sp%C3%A9ciaux
Merci :)
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/fr/docs/Guide_JavaScript_1.5:Op%C3%A9rateurs:Op%C3%A9rateurs_sp%C3%A9ciaux
Merci :)
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
15 déc. 2006 à 11:31
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 :
Mon tableau est une liste d'objet, d'ou l'acces à la propriété 'lib'.
Merci pour cette idée slum.
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.
Profil bloqué
>
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
15 déc. 2006 à 12:15
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
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
Profil bloqué
>
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
15 déc. 2006 à 17:26
15 déc. 2006 à 17:26
Bonsoir Kij_82,tu en est ou??
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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!).
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!).
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
7 avril 2008 à 10:51
7 avril 2008 à 10:51
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 :)
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 :)
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 :
Voila voila.
J'espère que ca en aidera quelques uns.
Bon code ...
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 0En 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 56Et 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,58Alors 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 ...
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 :
Encore désolé pour ces posts avec de mauvais codes...
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...