OVH Cloud OVH Cloud

supprimer un element dans un tableau associatif

16 réponses
Avatar
jacek55
Je fait :

tata["titi"] =3D undefined ;

et =E7a l'air de marcher. Mais est-ce vraiment correcte ?

jacek

6 réponses

1 2
Avatar
jacek55
YD wrote:
[...] je ne vois pas comment employer tata.splice() dans la mesure
ou il faut donner la liste des éléments déplacés (ceux qui se
trouvent derrière l'élément supprimé) comme argument du "splice ()",
ce qui ne me semble pas évident


Mais non !

Pour splice il faut deux arguments obligatoires :
- le rang de l'élément de départ : start
- le nombre d'éléments à supprimer de l'Array

et des éléments facultatifs item1, item2... qui sont
des éléments *à insérer* à l'endroit où on a supprimé...

Exemples :
1. a = new Array(0, 1, 2, 3, 4)
//length 5
a.splice(1,3);
//on supprime 3 éléments à partir de celui de rang 1 (le 2e don c)
//a est alors 0 4, length 2


Y.D.


mais comment faire pour obtenir b = [0,1,3,4], length 4 à partir de a
si sa longueur n'est pas figée ?

jacek


Avatar
Etienne SOBOLE
mais comment faire pour obtenir b = [0,1,3,4], length 4 à partir de a
si sa longueur n'est pas figée ?


Bonne question !

Avatar
Olivier Miakinen

1. a = new Array(0, 1, 2, 3, 4)
//length 5
a.splice(1,3);
//on supprime 3 éléments à partir de celui de rang 1 (le 2e donc)
//a est alors 0 4, length 2


mais comment faire pour obtenir b = [0,1,3,4], length 4 à partir de a
si sa longueur n'est pas figée ?


Euh... Je dirais :
b = a;
b.splice(2, 1);

Non ?


Avatar
YD
1. a = new Array(0, 1, 2, 3, 4)
//length 5
a.splice(1,3);
//on supprime 3 éléments à partir de celui de rang 1 (le 2e donc)
//a est alors 0 4, length 2
mais comment faire pour obtenir b = [0,1,3,4], length 4 à partir de a

si sa longueur n'est pas figée ?


Euh... Je dirais :
b = a;
b.splice(2, 1);

Non ?


Hmmm... b=a;
Si a est un objet javascript (et un Array en est un) l'affectation
se fait par référence c.-à-d. b est un autre nom pour désigner
l'objet désigné par a également.
b.splice(2,1) va modifier b et donc a (deux référents pour un même
objet) !

Mais une précision s'impose à l'attention de jacek55. Les méthodes
de Arrrays modifient presque toutes l'Array sur lequel elles sont
appliquées. Si on veut obtenir une copie d'un objet, ce n'est pas
trivial ! a.splice(2,1) modifie l'objet a.

Il ne faut pas écrire -- pour récupérer le résultat :
b = a.splice(2,1)
car non seulement on ne récupère pas en b une copie de a moins son
3e élément mais a est modifié et b est un objet Array contenant ce
qui est extrait de a, dans ce cas, un seul élément.

--
Y.D.



Avatar
Olivier Miakinen

mais comment faire pour obtenir b = [0,1,3,4], length 4 à partir de a
si sa longueur n'est pas figée ?


Euh... Je dirais :
b = a;
b.splice(2, 1);

Non ?


Hmmm... b=a;
Si a est un objet javascript (et un Array en est un) l'affectation
se fait par référence c.-à-d. b est un autre nom pour désigner
l'objet désigné par a également.
b.splice(2,1) va modifier b et donc a (deux référents pour un même
objet) !


Ah oui, en effet. Note que ça donne quand même le résultat voulu, même
s'il y a un effet de bord que ne voulait peut-être pas Jacek.

Mais une précision s'impose à l'attention de jacek55. Les méthodes
de Arrays modifient presque toutes l'Array sur lequel elles sont
appliquées. Si on veut obtenir une copie d'un objet, ce n'est pas
trivial ! a.splice(2,1) modifie l'objet a.


Est-ce que ceci marcherait ?
b = a.slice(0);
b.splice(2, 1);



Avatar
YD

[...] Les méthodes
de Arrays modifient presque toutes l'Array sur lequel elles sont
appliquées. Si on veut obtenir une copie d'un objet, ce n'est pas
trivial ! a.splice(2,1) modifie l'objet a.


Est-ce que ceci marcherait ?
b = a.slice(0);
b.splice(2, 1);


Ça marche tout à fait, le slice(0) permet de copier l'Array.

Mais... une remarque tout de même, ou une mise en garde plutôt.
Si l'Array contient un ou plusieurs objets parmi ses éléments,
ceux-ci ne sont pas copiés, seule leur référence est passée.

Et comme rien ne vaut un exemple...
<script type="text/javascript">
document.writeln('<pre>');

a = new Array(0,1,2,new Array('a','b','c'));
b = a.slice(0);

document.write('a.length = '+a.length+'t');
for (var i in a)
document.write('; a['+i+'] = '+a[i]);
document.writeln();
document.write('b.length = '+b.length+'t');

for (var i in b)
document.write('; b['+i+'] = '+b[i]);
document.writeln();

document.writeln('a===b -> '+ (a===b));
document.writeln('a[3]===b[3] -> '+ (a[3]===b[3]));

a[0]='ZERO'
a[3].splice(3,0,'d','e','f');

document.write('a.length = '+a.length+'t');
for (var i in a)
document.write('; a['+i+'] = '+a[i]);
document.writeln();
document.write('b.length = '+b.length+'t');
for (var i in b)
document.write('; b['+i+'] = '+b[i]);
document.writeln();
</script>

--
Y.D.


1 2