108 votes

Utilisez une boucle pour parcourir un tableau associatif Javascript dans un ordre trié

Imaginons que j'ai un tableau associatif Javascript (aussi appelé hash, ou dictionnaire) :

var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;

Comment puis-je itérer sur les clés dans un ordre trié ? Si cela peut simplifier les choses, je n'ai même pas besoin des valeurs (elles sont toutes juste le nombre 1).

133voto

molnarg Points 1019

Vous pouvez utiliser la méthode intégrée Object.keys :

var sorted_keys = Object.keys(a).sort()

(Remarque : cela ne fonctionne pas dans les navigateurs très anciens ne prenant pas en charge EcmaScript5, notamment IE6, 7 et 8. Pour des statistiques détaillées et à jour, consultez ce tableau)

124voto

Matthew Points 2160

Vous ne pouvez pas les parcourir directement, mais vous pouvez trouver toutes les clés et ensuite les trier simplement.

var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;    

function keys(obj)
{
    var keys = [];

    for(var key in obj)
    {
        if(obj.hasOwnProperty(key))
        {
            keys.push(key);
        }
    }

    return keys;
}

keys(a).sort(); // ["a", "b", "z"]

Cependant, il n'est pas nécessaire de faire de la variable 'a' un tableau. Vous l'utilisez vraiment comme un objet et devriez le créer comme ceci:

var a = {};
a["key"] = "value";

14voto

Luke Schafer Points 6250

Vous pourriez même le prototyper sur object :

Object.prototype.iterateSorted = function(worker)
{
    var keys = [];
    for (var key in this)
    {
        if (this.hasOwnProperty(key))
            keys.push(key);
    }
    keys.sort();

    for (var i = 0; i < keys.length; i++)
    {
        worker(this[ keys[i] ]);
    }
}

et l'utilisation :

var myObj = { a:1, b:2 };
myObj.iterateSorted(function(value)
{
    alert(value);
}

6voto

Grant Wagner Points 14085

Je suis d'accord avec la réponse de Swingley, et je pense que c'est un point important que beaucoup de ces solutions plus élaborées ignorent. Si vous ne vous préoccupez que des clés dans le tableau associatif et que toutes les valeurs sont '1', alors stockez simplement les 'clés' en tant que valeurs dans un tableau.

Au lieu de :

var a = { b:1, z:1, a:1 };
// code relativement élaboré pour récupérer les clés et les trier

Utilisez :

var a = [ 'b', 'z', 'a' ];
alert(a.sort());

Le seul inconvénient est que vous ne pouvez pas déterminer aussi facilement si une clé spécifique est définie. Consultez cette réponse à javascript function inArray pour une réponse à ce problème. Un problème avec la solution présentée est que a.hasValue('key') sera légèrement plus lent que a['key']. Cela peut ou non être important dans votre code.

3voto

Travis Wilson Points 483

Il n'y a pas de moyen concis de manipuler directement les "clés" d'un objet Javascript. Ce n'est pas vraiment conçu pour cela. Avez-vous la liberté de mettre vos données dans quelque chose de mieux qu'un objet régulier (ou un tableau, comme le suggère votre code d'exemple) ?

Si c'est le cas, et si votre question pourrait être reformulée comme "Quel objet similaire à un dictionnaire devrais-je utiliser si je veux itérer sur les clés dans un ordre trié ?", alors vous pourriez développer un objet comme ceci :

var a = {
  keys : new Array(),
  hash : new Object(),
  set : function(key, value) {
    if (typeof(this.hash[key]) == "undefined") { this.keys.push(key); }
    this.hash[key] = value;
  },
  get : function(key) {
    return this.hash[key];
  },
  getSortedKeys : function() {
    this.keys.sort();
    return this.keys;
  }
};

// utilisation d'exemple
a.set('b',1);
a.set('z',1);
a.set('a',1);
var sortedKeys = a.getSortedKeys();
for (var i in sortedKeys) { document.write(sortedKeys[i]); }

Si vous n'avez aucun contrôle sur le fait que les données se trouvent dans un objet régulier, cet utilitaire convertirait l'objet régulier en votre dictionnaire entièrement fonctionnel :

a.importObject = function(object) {
  for (var i in object) { this.set(i, object); }
};

Ceci était une définition d'objet (au lieu d'une fonction de constructeur réutilisable) pour la simplicité ; modifiez-la à volonté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X