Wie kann ich ein ES6 `Set` sortieren?

Lesezeit: 4 Minuten

new Set(['b', 'a', 'c']).sort() wirft TypeError: set.sort is not a function. Wie kann ich a sortieren? Set um eine bestimmte Iterationsreihenfolge sicherzustellen?

  • Mengen sind ungeordnet.

    – SLaks

    12. Oktober 2015 um 20:34 Uhr

  • @SLaks sind sie vielleicht, aber ich möchte den Vorteil eindeutiger Schlüssel nutzen können Sets Angebot, und trotzdem die Möglichkeit haben, die Elemente zu sortieren. Java-Angebote SortedSetsich kann nur annehmen, dass sie dies getan haben, weil jemand einen gültigen Anwendungsfall angeboten hat … ES6 sollte kein Java sein, aber das Sortieren von Sätzen scheint nützlich zu sein.

    – Ericsoco

    12. Oktober 2015 um 20:37 Uhr

  • Du kannst nicht sort() a SortedSet entweder. Es verwendet eine Baumstruktur, die das Durchlaufen in der Reihenfolge ermöglicht, aber Sie können es nicht Rückgeld diese Reihenfolge wie bei an ArrayList. Wenn Sie die Reihenfolge ändern möchten, verwenden Sie Listen.

    – Hat QUIT–Anony-Mousse

    12. Oktober 2015 um 22:54 Uhr


  • könnte etwas Forschung brauchen, aber ich denke Set bewahrt Ordnung new Set(['b', 'a', 'c'].sort())

    – Slai

    29. Juli 2018 um 15:16 Uhr

  • @Slai ecma-international.org/ecma-262/9.0/index.html#sec-set-objects Ich kann keine Aussage über die Reihenfolge der Elemente finden.

    – Ceving

    25. Februar 2019 um 15:15 Uhr

Benutzer-Avatar
Benjamin Grünbaum

Eine Menge ist keine geordnete abstrakte Datenstruktur.

EIN Set hat jedoch immer dieselbe Iterationsreihenfolge – Element-Einfügereihenfolge [1]also wenn Sie es iterieren (durch eine Iterationsmethode, durch Aufrufen Symbol.iteratoroder durch eine for.. of-Schleife) können Sie das immer erwarten.

Sie können den Satz jederzeit in ein Array konvertieren und dieses sortieren.

Array.from(new Set(["b","a","c"])).sort();
[...(new Set(["b","a","c"]))].sort(); // with spread.

[1] forEach und CreateSetIterator

  • Ich habe meine eigene Antwort gelöscht, die mit dieser identisch ist, aber ich werde meinen Kommentar wieder hinzufügen: „Ich hoffe wirklich, dass jemand eine Antwort geben kann, die nicht erforderlich ist Set zu Array und zurück. Scheint ziemlich ineffizient zu sein.”

    – Ericsoco

    12. Oktober 2015 um 20:38 Uhr


  • @ericsoco die ECMAScript-Spezifikation gibt keine an OrderedSet aber eine ähnliche Datenstruktur existiert in mehreren anderen Sprachen – typischerweise implementiert durch einen Baum. Sie können eine Userland-Sammlungsbibliothek verwenden, nämlich – das beliebte ImmutableJS bietet eine OrderedSet. In vielen Fällen wird dies wahrscheinlich effizienter sein. Wenn Sie also ein Set mit über 100.000 Elementen haben, würde ich definitiv in Betracht ziehen, stattdessen eine geordnete Set-Implementierung zu verwenden.

    – Benjamin Grünbaum

    12. Oktober 2015 um 20:40 Uhr


  • Bitte beachten Sie, dass Sie für eine Menge von Zahlen eine Vergleichsfunktion für die Sortierung angeben müssen: (x, y) => x - y. Ansonsten werden Ihre Nummern lexikografisch sortiert.

    – neo

    9. Oktober 2016 um 17:01 Uhr

  • @BenjaminGruenbaum: Ich glaube, Sie haben etwas falsch verstanden; laut seiner Dokumentation, Immutable.js’s OrderedSet nutzt die Einfügereihenfolge als Iterationsreihenfolge; Das heißt, es tut dasselbe wie der Standard, Ihrer Antwort zufolge Set tut.

    – ruach

    2. April 2019 um 20:03 Uhr

  • @ruakh Allerdings ein ImmutableJS OrderedSet Objekt tut erlauben Ihnen, seinen Inhalt zu sortieren, was a) dem Standard entspricht Set nichtund b) die gewünschte Funktionalität OP ist.

    – Jamie Ridding

    23. Mai 2020 um 2:20 Uhr


In einigen Fällen kann es vorzuziehen sein, den Satz an Ort und Stelle zu “sortieren”, ähnlich wie array.sort()das geht so:

function sortSet(set) {
  const entries = [];
  for (const member of set) {
    entries.push(member);
  }
  set.clear();
  for (const entry of entries.sort()) {
    set.add(entry);
  }
  return set;
};

sortSet(new Set([3,2,1]))
// => Set(3) { 1, 2, 3 }

der einfachste Weg, es so zu tun.

console.log(new Set(['b', 'a', 'c'].sort()))
//Set(3) {"a", "b", "c"}

  • Laut der Frage war sein Ziel, die Iterationsreihenfolge in der Menge beizubehalten. Es ist nicht erforderlich, Elemente in Set zu sortieren.

    – Taimoor Qureshi

    21. September 2021 um 15:16 Uhr

Die .sort-Funktion ist eine Funktion höherer Ordnung, was bedeutet, dass sie eine andere Funktion enthalten kann. Zunächst einmal kann nur .sort() mit Zeichen oder Zeichenfolgen funktionieren, aber es gibt Fehler für Zahlen. Ich habe Sets in meinem Video zusammen mit der Sortierfunktion besprochen. Ich hoffe du verstehst es. https://www.youtube.com/watch?v=ztw4Gh8eow

//This is sort() for getting numbers in ascending order:
const setC = new Set(([58,12,11,10,5,32]).sort((a,b)=>a -b));
//This is sort() for getting numbers in descending order:
const setC = new Set(([58,12,11,10,5,32]).sort((a,b)=>b -a));
//This is sort() for strings
const setD=new Set((['mangoes','bananas', 'apples','oranages']).sort());
// This is sort() for characters
const setD=new Set((['m', 'b', 'a', 'r']).sort());
You can convert the set to an array too and then sort it but that is not 
required in your case.
const arrayofsetA = Array.from(setA);
//for strings or characters
arrayofsetA.sort();
//for numbers or floating point numbers
arrayofsetA.sort((a,b) => a-b);

1229560cookie-checkWie kann ich ein ES6 `Set` sortieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy