OVH Cloud OVH Cloud

boucle dans un tableau indicé de façon non consécutive

26 réponses
Avatar
jero
Bonjour

je suis en train de me prendre les pieds dans le tapis ...

j'ai r=E9cup=E9r=E9 des donn=E9es dans une base de donn=E9es via
XMLHttpRequest jusque l=E0 tout va bien.
j'ai stock=E9 ces donn=E9es dans une variable globale de mon javascript :

var window.mesDonnees =3D new Array();

Afin de stock=E9 chaque colonne de chaque ligne r=E9cup=E9r=E9e dans ma
base j'ai imbriqu=E9 un tableau dans mon tableau windows.mesDonnes que
j'ai indic=E9 avec l'identifiant num=E9rique de chaque =E9l=E9ment
r=E9cup=E9r=E9 :

var window.mesDonnees[identifiantNum=E9rique] =3D new Array();

de sorte de pouvoir y stocker les valeur r=E9cup=E9r=E9es dans chaque
colonne

var window.mesDonnees[identifiantNum=E9rique][0] =3D valeurColonne_0
var window.mesDonnees[identifiantNum=E9rique][1] =3D valeurColonne_1
etc...

je ne trouve pas de methode pour faire une boucle dans mon tableau au
niveau ou il est indic=E9 par les identifiants num=E9riques, dans la
mesure o=F9 ils ne sont pas n=E9cessairement cons=E9cutifs !

de sorte que le classique

for ( var i =3D 0 ; i < window.mesDonnees.length ; i++) {
window.mesDonnees[i] faitQuelqueChose;
}

n'est pas op=E9rationnel ...

connaissez vous une m=E9thode qui pourrai fonctionner ? un genre
d'=E9quivalent =E0 la boucle 'for each' du PHP ?

D'avance grand merci !
J=E9r=F4me

6 réponses

1 2 3
Avatar
YD

a) Une bizarrerie remarquée (bug ?). Quand on crée un Array
var t = ['A',,,'B'];

On obtient avec IE et Op :
0 -> A
3 -> B

mais Firefox 2.0b2 répond
0 -> A
1 -> undefined
2 -> undefined
3 -> B


Sémantiquement firefox est dans le vrai


La question n'est-elle pas plutôt de savoir ce que prescrit la
norme (ECMA 262 3e éd.) ou si elle prévoit une latitude aux
différentes implémentations ? En l'occurrence, si j'ai bien
compris, Fx n'est pas "compliant" sur ce point.

["A",,,"B"]moi je lis un tableau
de 4 éléments dony le 2ème et le 3ème n'ont pas été définis.


Et bien moi je lis (après mise en oeuvre de l'algo de la norme)
un Array dont length est 4 et dont les propriétés nommées '0'
et '3' correspondent aux valeurs "A" et "B". L'Array en question
ne possède pas de 2e et 3e éléments. Si je veux obtenir la même
chose que Fx je devrais écrire :
var t=['A',undefined,undefined,'B'];
Là, ne créant pas d'élision (la virgule au début ou après une autre),
je force la création des propriétés '1' et '2' (ce que JScript -- IE
donc -- ne fait pas, ignorant les undefined...)

Un tableau creux je l'écrirais !
t=new Array();
t[0]="A";
t[3]="B";


Les deux écritures *doivent* produire le même résultat.

Mais dans quel cas je préférerais une notation de type dictionnaire.
t={0:'A',3:'B'};


Ce n'est pas une question de notation. Ici tu crées un Object et
non un Array (qui est dérivé de Object). Il s'agit de savoir quels
sont ses besoins. Si on n'utilise pas les propriétés des Arrays (les
nombreuses fonctions du prototype : join, concat, splice...) il est
effectivement sans intérêt d'utiliser un Array, puisqu'on ne se sert
alors que des propriétés dont il hérite d'Object !

--
Y.D.


Avatar
ASM

Les deux écritures *doivent* produire le même résultat.


proposition de petit test :

t=new Array();
t[0]="A";
t[3]="B";
var tbl = '<br>Array() avec length ==> ';
for(var i=0; i<t.length; i++) tbl += t[i]+' | ';
document.write(tbl);
var tbl = '<br>Array() avec in ==> ';
for(var i in t) tbl += t[i]+' | ';
document.write(tbl+'<br>');

t = ['A',,,'B'];
var tbl = '<br>[...] avec length ==> ';
for(var i=0; i<t.length; i++) tbl += t[i]+' | ';
document.write(tbl);
var tbl = '<br>[...] avec in ==> ';
for(var i in t) tbl += t[i]+' | ';
document.write(tbl+'<br>');


Résultats chez moi :

= IE 5.2 Mac = Safari 1.3.2 = Opera 9 = iCab 3 Array() avec length ==> A | undefined | undefined | B |
Array() avec in ==> A | B |
[...] avec length ==> A | undefined | undefined | B |
[...] avec in ==> A | B |

= Fx 1.5.0.6 Array() avec length ==> A | undefined | undefined | B |
Array() avec in ==> A | B |
[...] avec length ==> A | undefined | undefined | B |
[...] avec in ==> A | undefined | undefined | B |


Lequel de ces navigateurs a un bug ?

--
Stephane Moriaux et son [moins] vieux Mac

Avatar
BertrandB

Et bien moi je lis (après mise en oeuvre de l'algo de la norme)
un Array dont length est 4 et dont les propriétés nommées '0'
et '3' correspondent aux valeurs "A" et "B". L'Array en question
ne possède pas de 2e et 3e éléments.


Et bien ça me choque qu'un tableau ait des propriété et non pas des
'cases' ....Et sinon tu viens le dire aussi il est de 4 éléments dont
seulement deux ont une valeur définie.
Comme quoi, au delà des algorithme et des implémentations physiques i l
faut bien se mettre d'accord sur le sens.

Euh "les propriétés ... correspondent aux valeurs" en d'autres forum
(python) ce genre d'approximation se fait flinguer. La tournure est mal
venue car elle confond le contenant et le contenu.

Cordialement.

Avatar
YD
Désolé Stéphane, je ne vais pas réussir à être bref !

Les deux écritures *doivent* produire le même résultat.


proposition de petit test :

[...]

Résultats chez moi :

= IE 5.2 Mac = Safari 1.3.2 = Opera 9 = iCab 3 > [...] avec in ==> A | B |

= Fx 1.5.0.6 > [...] avec in ==> A | undefined | undefined | B |

Lequel de ces navigateurs a un bug ?


Il me semble que Firefox ne devrait pas créer les propriétés
'1' et '2'. Si j'ai bien compris l'algorithme (p. 40 et 41 de
la norme ECMA 262 3e éd.) les éléments élidés (une virgule au
début ou deux virgules consécutives) modifient la propriété
length de l'Array mais aucune nouvelle propriété n'est créée.

Quand le JS rencontre ['A',,,'B'] :
- Il évalue 'A' et crée une Array contenant l'élément nommé
'0' avec la valeur 'A',length 1.
- Ensuite il y a une élision (2 virgules se suivent), la
valeur de length est augmentée de 1.
- Encore une élision, on augmente de 1 length.
- Enfin 'B', on ajoute à l'Array une propriété nommée
comme la valeur de length, donc 3, et avec la valeur 'B'.

Au final on se retrouve avec une Array de length 4 et deux
éléments définis et effectivement créés '0' et '3'. Donc
l'énumération des propriétés énumérables avec for ... in
ne doit pas faire ressortir '1' -> undefined et
'2' -> undefined puisque ces propriétés ne devraient pas
avoir été créées.

Si on veut obtenir A | undefined | undefined | B | il faut
le déclarer explicitement en écrivant :
['A',undefined,undefined,'B']

Mais si l'on procède ainsi c'est IE/Win qui cette fois déraille,
en faisant comme si on avait écrit ['A',,'B'] !

--
Y.D.


Avatar
YD

Et bien moi je lis (après mise en oeuvre de l'algo de la norme)
un Array dont length est 4 et dont les propriétés nommées '0'
et '3' correspondent aux valeurs "A" et "B". L'Array en question
ne possède pas de 2e et 3e éléments.


Et bien ça me choque qu'un tableau ait des propriété et non pas des
'cases' ....


C'est que tu penses à un tableau comme une structure de données, comme
en C, sans doute. Ce que n'est absolument pas un Array en javascript.
C'est un descendant de l'objet Object. Pour s'en convaincre :

Object.prototype.tag='$$$';
var a=[0,,,,1];
for (var i in a)
document.writeln('a[' + i + '] = ' + a[i]);

Et sinon tu viens le dire aussi il est de 4 éléments dont
seulement deux ont une valeur définie.


Jamais dit ça ! J'ai dit length est 4, c.-à-d. sa propriété nommée
length contient la valeur 4 !

Comme quoi, au delà des algorithme et des implémentations physiques il
faut bien se mettre d'accord sur le sens.


Et quand on utilise un Array en javascript comprendre qu'on n'a pas du
tout un tableau tel qu'on l'entend en C, en Perl, etc.

Euh "les propriétés ... correspondent aux valeurs" en d'autres forum
(python) ce genre d'approximation se fait flinguer. La tournure est mal
venue car elle confond le contenant et le contenu.


C'est un forum difficile aussi celui-ci, même s'il y a peu de contributeurs
-- y en a un qui m'a flamé et boude maintenant ! En tout cas je te remercie
du ton que tu utilises alors que, visiblement, on n'est pas d'accord.

C'est vrai que c'était mal tourné et la phrase suivante également. C'était
une approximation. Ce n'est pas facile de rester clair en parlant technique.
J'aurais dû écrire en toute rigueur :
...et dont les propriétés nommées '0' et '3' contiennent respectivement
les valeurs "A" et "B". Cet objet Array ne possède pas de propriétés
nommées '1' et '2'.

Cordialement.


De même.

--
Y.D.


Avatar
BertrandB
s' ....

C'est que tu penses à un tableau comme une structure de données, co mme
en C, sans doute.


Non non ... je fait référence au monde réel pas à un langage pré cis. Le
fait que le "array" soit un object qui est lui même un dictionnaire ...
c'est de l'implémentation.

1 2 3