web-dev-qa-db-fra.com

Comment trier une carte par valeur en javascript?

var map = new Map();
map.set("orange",10);
map.set("Apple",5);
map.set("banana",20);
map.set("cherry",13);

Comment trier cette carte par valeur?

9
chenxinlong

Vous pourriez adopter une approche différente et changer Symbol.iterator of Map.prototype[@@iterator]() pour un résultat trié personnalisé.

var map = new Map();

map.set("orange", 10);
map.set("Apple", 5);
map.set("banana", 20);
map.set("cherry", 13);

map[Symbol.iterator] = function* () {
    yield* [...this.entries()].sort((a, b) => a[1] - b[1]);
}

for (let [key, value] of map) {     // get data sorted
    console.log(key + ' ' + value);
}

console.log([...map]);              // sorted order
console.log([...map.entries()]);    // original insertation order
.as-console-wrapper { max-height: 100% !important; top: 0; }

4
Nina Scholz
const myMap = new Map();
myMap.set("a",3);
myMap.set("c",4);
myMap.set("b",1);
myMap.set("d",2);

// sort by value
const mapSort1 = new Map([...myMap.entries()].sort((a, b) => b[1] - a[1]));
console.log(mapSort1);
// Map(4) {"c" => 4, "a" => 3, "d" => 2, "b" => 1}

const mapSort2 = new Map([...myMap.entries()].sort((a, b) => a[1] - b[1]));
console.log(mapSort2);
// Map(4) {"b" => 1, "d" => 2, "a" => 3, "c" => 4}

// sort by key
const mapSort3 = new Map([...myMap.entries()].sort());
console.log(mapSort3);
// Map(4) {"a" => 3, "b" => 1, "c" => 4, "d" => 2}

const mapSort4 = new Map([...myMap.entries()].reverse());
console.log(mapSort4);
// Map(4) {"d" => 2, "b" => 1, "c" => 4, "a" => 3}
4

Dans ES6, vous pouvez le faire comme ceci: (supposons que votre objet Map est m).

[...m].map(e =>{ return e[1];}).slice().sort(function(a, b) {
  return a - b; 
});

l'opérateur spread transforme un objet Map en tableau, puis extrait le deuxième élément de chaque sous-tableau pour construire un nouveau tableau, puis le trie. Si vous souhaitez trier par ordre décroissant, remplacez simplement a - b par b - a.

2
newguy

C'est un mappage clé-valeur. Le maintien de l'ordre dans lequel les clés sont insérées annule le bénéfice du temps d'insertion O(1).

Pourquoi voudriez-vous le trier? Si nécessaire, il est préférable de conserver un tableau de paires clé-valeur et de les trier pour les utiliser ultérieurement. Pour votre cas, 

arr = [["orange", 10],["appple", 5], ["banana", 20], ["cherry", 13]];

Utiliser une fonction de tri personnalisée en tant que

arr.sort = function(a,b) {
    return a[1]>b[1]? 1:a[1]<b[1]?-1:0;
}

Appliquer le tri,

keysArr.sort()

Parcourez keysArr trié et utilisez des éléments qui permettent de récupérer une valeur.

2
zapper123

Vous pouvez utiliser une liste de cartes au lieu d'une carte seulement ..__

var yourListMaps = [];
var a = {quantity: 10, otherAttr: 'tmp1'};
var b = {quantity: 20, otherAttr: 'tmp2'};
var c = {quantity: 30, otherAttr: 'tmp3'};
yourListMaps.Push(a);
yourListMaps.Push(b);
yourListMaps.Push(c);

Et si vous souhaitez trier par quantité, vous pouvez:

Sort c > b > a:
yourListMaps.sort(function(a,b){
    return b.quantity - a.quantity;
});

ou 

Sort a > b > c;
yourListMaps.sort(function(a,b){
    return a.quantity - b.quantity;
});
0
Nguyễn Thắng