Heim >Web-Frontend >js-Tutorial >Warum führen boolesche Rückgabewerte zu unerwarteten Ergebnissen in den Sortiervergleichsfunktionen von JavaScript?

Warum führen boolesche Rückgabewerte zu unerwarteten Ergebnissen in den Sortiervergleichsfunktionen von JavaScript?

Susan Sarandon
Susan SarandonOriginal
2024-12-16 19:09:21271Durchsuche

Why Do Boolean Return Values Cause Unexpected Results in JavaScript's Sort Comparison Functions?

Sortieren in JavaScript: Boolesche Rückgabewerte in Vergleichsfunktionen

Das Problem

Trotz allgemeiner Praxis wird in JavaScript ein boolescher Wert (wahr oder falsch) zurückgegeben Vergleichsfunktionen, die zum Sortieren in JavaScript verwendet werden, sind falsch und können zu unerwarteten Ergebnissen führen.

Die Grund

Sortieralgorithmen erwarten von Vergleichsfunktionen, dass sie Zahlen zurückgeben, insbesondere:

  • Eine positive Zahl, wenn das erste Argument nach dem zweiten sortiert werden soll
  • 0wenn die beiden Argumente als gleich angesehen werden
  • A negative Zahl, wenn das erste Argument vor dem zweiten sortiert werden soll

Die Rückgabe eines booleschen Werts (falsch entspricht 0 und wahr entspricht 1) erfüllt die Transitivitätsanforderung für konsistente Vergleichsfunktionen nicht . Diese Anforderung stellt sicher, dass der Sortieralgorithmus auf der Grundlage früherer Vergleiche Rückschlüsse auf die Reihenfolge von Elementen ziehen kann.

Eine überraschende Demonstration

Bedenken Sie die Vergleichsfunktion:

function compare(a, b) {
    return a > b;
}

Dies Die Funktion gibt true (oder 1) zurück, wenn „a“ größer als „b“ ist, gibt aber fälschlicherweise false (oder 0) zurück, selbst wenn „b“ größer als „a“ ist. Folglich behandelt der Sortieralgorithmus „a“ und „b“ als gleich, was zu unvorhersehbaren Sortierreihenfolgen führt.

Gegenbeispiele

Obwohl einige grundlegende Tests bestanden wurden, schlägt die obige Vergleichsfunktion unter bestimmten Umständen fehl. wie zum Beispiel:

[0, 1, 0].sort(compare);  // Result: [0, 1, 0] (expected: [0, 0, 1])
[1, 1, 0, 2].sort(compare);  // Result: [0, 1, 2, 1] (expected: [0, 1, 1, 2])

Korrekte Vergleichsfunktionen

Für eine lexikografische Sortierung (aufsteigend), verwenden Sie keine Vergleichsfunktion, da Elemente zum Vergleich automatisch in Zeichenfolgen umgewandelt werden.

Verwenden Sie für die numerische Sortierung:

function compareNumbers(a, b) {
    return a - b;
}

Für komplexere Vergleiche verwenden Sie bedingte Anweisungen Geben Sie die entsprechende Nummer zurück:

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

Das obige ist der detaillierte Inhalt vonWarum führen boolesche Rückgabewerte zu unerwarteten Ergebnissen in den Sortiervergleichsfunktionen von JavaScript?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn