Problème d'Inversion de Tableau d'Objets avec JS
Je suis parsing JSON et d'obtenir un tableau d'objets javascript. J'ai fait cela pour ensuite ajouter un élément pour chaque objet:
for(o in obj){ ... }
Mais j'ai réalisé que pour une certaine situation, je veux revenir en arrière à travers le tableau. J'ai donc essayé cela avant la boucle for:
obj = obj.reverse();
Cependant ce n'est pas l'inversion de l'ordre des objets dans le tableau. Je pourrais simplement mettre un nombre variable dans la boucle pour récupérer manuellement l'inverse, mais je suis perplexe quant à pourquoi l'inverse ne semble pas fonctionner avec des tableaux d'objets.
obj = obj.reverse()
est inutile, parce que reverse
est une méthode mutateur. Vous pouvez simplement faire obj.reverse()
.Selon le MDN cela devrait fonctionner. Notez que vous devez pas parcourir un tableau avec
for...in
. Utiliser une normale for
boucle, alors vous pouvez simplement parcourir de arr.length
à 0
. Il n'a pas d'importance à tous les types de données contenues dans le tableau. Si vous avez réellement un objet et non pas un tableau alors vous ne pouvez pas inverser l'ordre de toute façon (il n'y a pas d'ordre). Veuillez indiquer la valeur de obj
.OriginalL'auteur captDaylight | 2012-03-14
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas une telle chose comme un "tableau d'objets" en JavaScript. Il y a des Objets, et il y a des Tableaux (qui, bien sûr, sont aussi des Objets). Les objets ont des propriétés et les propriétés ne sont pas classées dans une façon définie.
En d'autres termes, si vous avez:
il n'y a aucune garantie qu'une
for ... in
boucle visiter les propriétés de la commande "a", "b", "c".Maintenant, si vous avez une tableau d'objets comme:
alors que c'est un tableau ordinaire, et vous pouvez l'inverser. Le
.reverse()
méthode se transforme le tableau, de sorte que vous n'avez pas re-assigner. Si vous ne avez un tableau d'objets (ou d'un vrai tableau de toute sorte de valeurs), alors vous devriez pas utilisationfor ... in
pour itérer à travers elle. L'utilisation d'un index numérique.modifier — il souligné dans un commentaire que
.reverse()
retourne une référence à la matrice, de sorte que réaffectation des ne fera pas de mal quoi que ce soit.Object
n'a pas de méthodereverse()
, où-comme unArray
n'.... par conséquent, vous ne pouvez pas inverser l'ordre parce qu'il n'existe pas.
Mais réaffectation des de la matrice ne sera pas un problème non plus...
ah OK, j'étais juste sur le point d'essayer cela dans la console. Le MDN page ne disent pas ce que la valeur de retour est, je ne pense pas. (Je vais le mettre à jour.) modifier oups oui, il le fait dire. OK, alors 🙂
eh bien, vous pouvez rencontrer des problèmes avec
for ... in
parce qu'il ramasse tous les propriétés de l'objet, non seulement numériquement-indexé. De Plus, bien sûr, vous êtes assuré de voir le numérique indexé paramètres dans le bon ordre lorsque vous êtes en définissant explicitement le "bon de commande" avec la façon dont vous incrémenter ou décrémenter à travers la boucle.OriginalL'auteur Pointy
C'est parce que la
for (o in obj)
n'a pas d'itérer le tableau comme un tableau, mais comme un objet. Il parcourt les propriétés de l'objet, qui comprend également les membres du réseau, mais ils sont itérées dans l'ordre de leur nom, et non pas la commande que vous avez placé dans le tableau.En outre, vous êtes à l'aide de la
reverse
méthode de mal. Il renverse le réseau en place, afin de ne pas utiliser la valeur de retour:for ... in
boucle se déroule dans l'ordre du nom, est qu'une déclaration de la façon dont certains/plus/tous les navigateurs se comporter? Mon impression est que la spécification ne définit pas explicitement la commande ...Vous avez raison, il ne la définit pas. Les navigateurs ne se comportent différemment. Certains sont à parcourir les propriétés dans l'ordre d'insertion (je pense que Firefox ne), tandis que d'autres (je pense que Chrome) première itération sur le numérique des propriétés et puis alphanumérique... ou quelque chose comme ça. On ne peut absolument pas compter sur le bon de commande sur différents navigateurs.
OriginalL'auteur Guffa