Hoe sorteer ik een kaart op waarde in JavaScript?

Hoe sorteer ik deze kaart op waarde?

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

Antwoord 1, autoriteit 100%

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}

Antwoord 2, autoriteit 35%

U kunt een andere benadering kiezen en wijzigen Symbol.iteratorvan Map.prototype[@@iterator]()voor een aangepast gesorteerd resultaat.

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; }

Snippet uitvouwen


Antwoord 3, autoriteit 6%

In ES6 kun je het als volgt doen: (neem aan dat je kaartobject mis).

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

de spread-operator verandert een Map-object in een array, verwijdert vervolgens het tweede element van elke subarray om een ​​nieuwe array te bouwen en sorteert deze. Als u in aflopende volgorde wilt sorteren, vervangt u gewoon a - bdoor b - a.


Antwoord 4, autoriteit 4%

Je kunt de functie inkorten en gebruiken in ES6- met de pijlfunctie (lambda)

let m2= new Map([...m.entries()].sort((a,b) => b[1] - a[1]))

Antwoord 5, autoriteit 3%

U kunt lijstkaarten gebruiken in plaats van alleen kaarten.
Probeer dit:

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);

En als u op aantal wilt sorteren, kunt u:

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

of

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

Antwoord 6, autoriteit 2%

Gebruik de onderstaande code om een ​​kaartobject te sorteren.

const map = new Map();
map.set("key","value");
map.set("key","value");
const object = Object.keys(map.sort().reduce((a,b) => (a[k] = map[a], b), {});
console.log(object);
//This will work to sort a map by key.

Antwoord 7

let map = new Map();
map.set("apple", 1);
map.set("banana", 5);
map.set("mango", 4);
map.set("orange", 9);
let sorted = Object.keys(map).sort((a,b) => {
    return map[b] - map[a];
});
console.log(sorted);

Antwoord 8

Om een ​​object te sorteren, gebruik je gewoon

const sortedObject = mapObject.sort((a,b)=>return b.value - a.value) 

Antwoord 9

Er zijn hier verschillende geldige antwoorden, maar ik denk dat het aspect “geordende kaart” de zaken onnodig compliceert en verwart.

Ervan uitgaande dat het voldoende is om een ​​lijst van de sleutelsin de map gesorteerd op waarde te krijgen, in plaats van een kaart waarvan de items zijn gesorteerd op waarde, dan werkt zoiets als dit:

var map = {
  orange: 10,
  apple: 5,
  banana: 20,
  cherry: 13
}
var sorted_keys = Object.keys(map).sort(function(a,b) { return map[a] - map[b]; });

wat oplevert:

["apple", "orange", "cherry", "banana"]

Dit is iets minder elegant als u de kaartitems wilt herhalen (nu moet u de reeks gesorteerde sleutels herhalen en in plaats daarvan de waarden ophalen), maar:

  1. Deze logica is veel gemakkelijker voor mijn eenvoudige geest om te volgen en te onthouden.

  2. Er is een vrij algemeen gebruik voor “sorteer deze kaart op waarde” waarin je de gesorteerde lijst met sleutels wilt hebben: een kaart gebruiken om een ​​telling bij te houden. (Bijvoorbeeld door de woorden in een bestand te herhalen met behulp van een kaart om bij te houden hoe vaak elk woord voorkomt en vervolgens die kaart te sorteren om een ​​lijst met woorden op frequentie te krijgen.)

Voor het algemene geval waarin de waarden in de kaart niet noodzakelijk numeriek zijn, vervangt u de comparatorfunctie (de functie doorgegeven aan Object.keys(map).sort) door iets als:

function(a, b) {
  return (a < b) ? -1 : ( (a > b) ? 1 : 0 );
}

(wat in wezen is:

function(a, b) {
  if (a < b) {
    return -1;
  } else if (a > b) {
    return 1;
  } else {
    return 0;
  }
}

maar met behulp van de ternaire (? :) operator.)

Maar houd er rekening mee dat het gedrag van de JavaScript-operators <en >soms een beetje contra-intuïtief is met gemengde typen, dus afhankelijk van de waarden op uw kaart misschien wil je expliciete typecasting-logica in je comparator opnemen.

Other episodes