Est-il possible de trier une ES6 objet map?
Est-il possible de trier les entrées d'un es6 objet map?
var map = new Map();
map.set('2-1', foo);
map.set('0-1', bar);
résultats dans:
map.entries = {
0: {"2-1", foo },
1: {"0-1", bar }
}
Est-il possible de trier les entrées en fonction de leurs clés?
map.entries = {
0: {"0-1", bar },
1: {"2-1", foo }
}
- Les cartes sont intrinsèquement pas commandé (à l'exception de la sont itérées ordre d'insertion, ce qui nécessite de tri et puis [re-]ajout).
- Trier les entrées lorsque vous parcourez la carte (c'est à dire. tourner dans un tableau)
Vous devez vous connecter pour publier un commentaire.
Selon le MDN documentation:
Vous pourriez faire de cette façon:
JS:
À l'aide de
.sort()
, n'oubliez pas que le tableau est trié en fonction de chaque personnage de point de code Unicode valeur, selon la chaîne de conversion de chaque élément. Donc2-1, 0-1, 3-1
seront triés correctement.var mapAsc = new Map([...map.entries()].sort((a,b) => a[0] > b[0]));
l'aide des touches flèche function (lambda)2-1,foo
à0-1,bar
et3-1,baz
(a,b) => a[0] > b[0]
!var mapAscByKey = new Map([...map.entries()].sort((a,b) => a[0] > b[0] ? 1 : a[0] < b[0] ? -1 : 0));
. Comme je l'ai dit de prendre la commande en fonction de la valeur convertie en une chaîne de caractères. Dans ce cas, si les clés sont uniques, il n'y aura pas de problème à l'ordre de cette façon....
points sont important sinon vous essayez de trier un MapIterator1e-9
mis après100
dans triés carte. Code qui fonctionne avec des nombres:new Map([...map.entries()].sort((e1, e2) => e1[0] - e2[0]))
Convertir
Map
d'un tableau à l'aideArray.à partir de
, sorte de tableau, de convertir retour àMap
, par exemple[...map.values()].sort()
ne fonctionne pas pour moi, maisArray.from(map.values()).sort()
n'Réponse courte
Par exemple, la comparaison de chaînes de valeur, qui peut être égal, on passe d'une fonction de tri qui accède à [1] et a une égalité de condition qui renvoie 0:
La comparaison clé des chaînes, qui ne peut pas être égal à (chaîne identique clés serait de remplacer les uns les autres), on peut ignorer l'égale condition. Toutefois, il faut toujours renvoyer explicitement -1, parce que le renvoi d'un paresseux
a[0] > b[0]
incorrectement donne de faux (traités comme des 0, c'est à dire égale à) lorsquea[0] < b[0]
:En détail avec des exemples
La
.entries()
dans[...map.entries()]
(suggéré dans plusieurs réponses) est redondant, probablement, en ajoutant une itération de la carte à moins que la JS moteur optimise tout ça pour vous.Dans le simple cas de test, vous pouvez faire ce que la question demande à:
...qui, si les touches sont toutes les chaînes, compare écrasé et contraints par des virgules rejoint clé-valeur des chaînes de caractères comme
'2-1,foo'
et'0-1,[object Object]'
, de retourner une nouvelle Carte avec le nouvel ordre d'insertion:Remarque: si vous ne voyez que
{}
dans la sortie de la console, regardez dans votre navigateur réel de la consoleJS:
CEPENDANT, c'est pas une bonne pratique pour utiliser la coercition et stringification comme ça. Vous pouvez obtenir des surprises comme:
JS:
Bugs de ce genre sont vraiment difficiles à déboguer - ne pas prendre le risque!
Si vous souhaitez effectuer le tri des clés ou des valeurs, il est préférable d'y accéder de manière explicite avec
a[0]
etb[0]
dans la fonction de tri, comme ceci. Notez que nous devrions revenir-1
et1
pour avant et après, pasfalse
ou0
comme avec rawa[0] > b[0]
parce que c'est traités comme des égaux:JS:
L'idée est d'extraire les clés de votre carte dans un tableau. Trier ce tableau. Parcourir ce tableau trié, obtenir sa valeur au pair de l'ménagères de la carte et de les mettre dans une nouvelle carte. La nouvelle carte sera dans l'ordre de tri. Le code ci-dessous est-il de la mise en œuvre:
unsortedMap.keys()
. Aussikeys.sort().map...
devrait êtrekeys.sort().forEach...
.Vous pouvez convertir un tableau et d'appel de la matrice de soring méthodes sur elle:
Malheureusement, pas vraiment mis en œuvre dans l'ES6. Vous avez cette fonction avec OrderedMap.sort() de ImmutableJS ou _.sortBy() de Lodash.
L'extrait de code ci-dessous sortes de carte donné par ses touches et fait correspondre les touches de la clé-des objets de valeur à nouveau. J'ai utilisé localeCompare fonction depuis mon plan était de chaîne->string object map.
résultat:
[{t:'tt'}, {x:'xx'}, {y: 'yy'}];
Est un moyen d'obtenir les entrées de tableau, à les trier, puis créer une nouvelle Carte avec le tableau trié:
Mais si vous ne voulez pas créer un nouvel objet, mais de travailler sur la même un, vous pouvez faire quelque chose comme ceci:
Peut-être plus réaliste exemple à propos de ne pas trier un objet Map mais de les préparer pour le tri avant de faire la Carte. La syntaxe devient en fait assez compact si vous le faites comme ça. Vous pouvez appliquer le tri avant la fonction map comme ça, avec une fonction de tri avant de la carte (Exemple à partir d'une Réagir application que je suis en train de travailler sur l'utilisation de JSX syntaxe)
Marque que j'ai ici de définir une fonction de tri à l'intérieur à l'aide d'une flèche fonction qui renvoie -1 si elle est plus petite, et 0 sinon triés sur une propriété des objets Javascript dans le tableau-je obtenir à partir d'une API.