12
votes

Comment puis-je trier une table de hachage en JavaScript?

J'ai une table de hachage JavaScript, comme:

function compareThings(thing1, thing2) {
    var name1 = thing1["name"].toLowerCase();
    var name2 = thing2["name"].toLowerCase();
    if (name1 < name2) {
        return -1;
        }
    if (name1 > name2) {
        return 1;
        }
    return 0;
}

things.sort(compareThings);


1 commentaires

Vous n'avez pas d'objet Hâble (objet AKA) ni un tableau approprié. Si vous avez un objet pour avoir un objet, vous devez l'initialiser avec {} pas avec [] . Si vous initialisez avec [] , vous avez un tableau, mais ne l'ajoutez pas à l'aide de A ["one"] et A ["Deux" ] mais par a.push (...); . Seulement après que vous sachiez quelle structure de données vous voulez, pouvez-vous vous soucier du tri. (BTW: foo ["bar"] est identique que foo.bar , utilisez la seconde, il ne bouge pas le code avec des littéraux de chaîne et de nombreux crochets)


5 Réponses :


2
votes

Vos paramètres sont Thing1 et Thing2 , mais vous référenciez quelques variables appelées asp1 et asp2 , Ce qui, autant que je puisse dire de la source que vous avez fournie, n'existez pas.

En outre, je pense que ce que vous recherchez est un tableau associatif, qui n'est pas instancié avec la syntaxe [] . Voir ici pour plus d'informations:

http://www.quirksmode.org/js/associative.html

Edit: Je ne pense pas qu'il y a un tableau en JavaScript, qui vous laissera faire ce que vous voulez.

Vous pouvez avoir un vieux tableau simple, qui vous permettra de faire le tri personnalisé ou Vous pouvez avoir un tableau associatif, ce qui vous permettra de disposer des valeurs nommées.

Avec la matrice régulière, vous pouvez évidemment itération à travers les index.

Avec la matrice associative, vous pouvez parcourir les noms en faisant pour (var-key in myarray)


2 commentaires

Soyez prudent avec ça pour ... en syntaxe. Ça va boucler sur tous les propriétés L'objet en question a, ce qui inclut des objets autres que des clés de réseau.


^^ C'est vrai, mais ne devrait pas être un problème aussi longtemps qu'il n'hérite rien.



18
votes

Si vous voulez itérer via une table de hachage en JavaScript dans l'ordre, faites-la, remplissez-la avec les touches de hachage, puis triez-la.

<html>
<body>
<pre>
  <script>
    var things = new Object ();
    things["hello"] = {"name" : "zzz I fell asleep", "number" : 7};
    things["one"] = {"name" : "something", "number" : 18};
    things["two"] = {"name" : "another thing", "number" : -2};
    var keys = [];
    for (var key in things) {
      if (things.hasOwnProperty(key)) {
        keys.push(key);
      }
    }
    keys.sort ();
    for (i in keys) {
      var key = keys[i];
      var value = things[key];
      document.write (key +"="+value+"\n");
    }
  </script>
</pre>
</body>
</html>


4 commentaires

Juste une note, l'ordre d'itération du pour ... dans déclaration peut être arbitraire, rien ne décrit dans le Spécification ECMAScript sur l'ordre d'énumération des propriétés, il est de la mise en œuvre dépendante ... Pas de garanties, utilisez avec soin ...


@CMS: Je devrais donc utiliser pour (var i = 0; i pour être strictement correct?


@Kinopiko, exactement, examine les articles suivants pour plus d'informations: [1] ( andrewdupont.net/2006/05/18/... ) et [2] ( dhtmlkitchen.com/?category=/javascript/&date=2007/10/21/... ) .


Vous pouvez également construire votre (code> tableau à l'aide de objet.keys (Choses) . C'est aussi une bonne pratique pour stocker la longueur de la matrice avant l'étape de comparaison de la boucle, de sorte que @ CMS's pour la boucle de ci-dessus pourrait être écrite comme pour (var i = 0, L. Longueur; i . Cela évite d'indexation répétée dans la propriété Keys.Length pour une valeur qui ne change pas.



7
votes

Ma solution

things.sort(function(a,b){return a.name - b.name;});


1 commentaires

Op utilise le tableau choses de manière incorrecte pour que cela ne vous aide pas.



5
votes

J'ai développé une fonction qui trie une table de hachage par la clé, peu importe si la valeur est un nombre ou une chaîne. Il conserve la clé si la table est une table associée.

var things = new Object ();
things["hello"] = {"name" : "zzz I fell asleep", "number" : 7};
things["one"] = {"name" : "something", "number" : 18};
things["two"] = {"name" : "another thing", "number" : -2};

things = sortHashTableByKey(things, 'name');

/*
[
  two: { name: 'another thing', number: -2 },
  one: { name: 'something', number: 18 },
  hello: { name: 'zzz I fell asleep', number: 7 }
]
*/


2 commentaires

@Hayksaakian, comment est la fonction qui va venir? En tant qu'être humain, j'admire vraiment l'effort de quiconque pour soutenir l'état et fonctionner au-delà de l'esprit / problème corporel. Bravo.


J'aurais dû dire "faire cela" pas "étant ceci" @toddmorison



0
votes

Même chose que EeeaHul, avec clés () et chaîne (). localecompare (): xxx


0 commentaires