2015-03-04 2 views
2

Je cherche un moyen simple de trier une carte par valeur en javascript. J'ai trouvé here la fonction Object.keys(myMap), mais il retourne un tableau de chaîne. Dans mon cas, les clés ne sont pas des chaînes mais des objets complexes, alors le résultat n'est pas vraiment bon (le tableau est vide ...). Connaissez-vous un autre moyen?trier Carte par valeur en javascript

EDIT

Explication de mon but: Je Map<myClass, Array<myClass>>, et je veux trier cette carte wrt la longueur des valeurs (tableaux), de la plus courte à la plus longue.

+3

Tri d'une carte est impossible, car ils utilisent hash intérieurement. Pouvez-vous expliquer avec un exemple? – thefourtheye

+0

_les clés ne sont pas des chaînes mais des objets complexes_ Pouvez-vous expliquer ce que sont les "objets complexes"? – R3tep

+1

@ R3tep methinks OP signifie [cette carte] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map) – Grundy

Répondre

8

Vous ne pouvez pas trier une carte directement, mais vous pouvez le convertir en un tableau, les trier et de créer une nouvelle carte:

m = new Map() 
 

 
m.set({x:1}, [1,2,3]); 
 
m.set({x:2}, [1,2,3,4]); 
 
m.set({x:3}, [1,2]); 
 
m.set({x:4}, [1,2,3,4,5]); 
 
m.set({x:5}, [1]); 
 

 
// can also use Array.from polyfill here 
 
a = []; 
 
for(var x of m) 
 
    a.push(x); 
 

 
a.sort(function(x, y) { 
 
    return x[1].length - y[1].length; 
 
}); 
 
    
 
sorted = new Map(a); 
 
for(var x of sorted) 
 
    document.write(JSON.stringify(x) + "<br>");

+0

le constructeur 'new Map (a)' ne fonctionne pas, il est dit "_Les paramètres fournis ne correspondent à aucune signature de l'appel target_". Est-ce dû au fait que je code dans TypeScript et pas dans JavaScript? –

+0

@FabrizioMorello: peut être ... Je ne sais pas TS, y at-il un moyen de le tester en ligne? – georg

+0

Je ne sais pas. Quoi qu'il en soit, votre solution semble correcte, puis comme j'ai demandé une solution pour javascript, je la marquerai comme acceptée. –