MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

Array.prototype.sort()

Diese Übersetzung ist unvollständig. Bitte helfen Sie, diesen Artikel aus dem Englischen zu übersetzen.

Die sort() -Methode sortiert die Elemente eines Arrays und gibt das Array zurück. Die Sortierung ist nicht immer stabil. Die Standardsortierung folgt den Unicode Codepoints.

var fruit = ['cherries', 'apples', 'bananas'];
fruit.sort(); // ['apples', 'bananas', 'cherries']

var scores = [1, 10, 21, 2]; 
scores.sort(); // [1, 10, 2, 21]
// Achtung: 10 kommt vor 2
// weil '10' in der lexikalischen Unicode-Reihenfolge vor '2' steht.

var things = ['word', 'Word', '1 Word', '2 Words'];
things.sort(); // ['1 Word', '2 Words', 'Word', 'word']
// In Unicode sind Nummern vor Großbuchstaben geordnet,
// welche vor Kleinbuchstaben geordnet sind.

Syntax

arr.sort()
arr.sort(compareFunction)

Parameter

compareFunction Optional
Vergleichsfunktion - Definiert eine Funktion, die die Sortierreihenfolge festlegt. Wird sie weggelassen, werden die Zeichen des Arrays nach den Werten des Unicode code point systems geordnet.

Rückgabewert

Das sortierte Array.

Beschreibung

Wird compareFunction nicht angegeben, werden die Elemente sortiert indem sie zu strings konvertiert und diese nach der Unicode point order verglichen werden. Zum Beispiel kommt "Apfel" vor "birne". Bei der numerischen Sortierung kommt 9 vor 80, aber da Nummern in Strings konvertiert werden, kommt "80" vor "9" in der Unicode-Reihenfolge.

Wird compareFunction angegeben, werden die Array-Elemente basierend auf den Rückgabewerten der Vergleichsfunktion geordnet. Wenn a und b zwei zu vergleichende Elemente sind, dann:

  • Wenn compareFunction(a, b) kleiner als 0, sortiere a auf einen niedrigeren Index als b, d.h. a kommt zuerst.
  • Wenn compareFunction(a, b) den Wert 0 zurückgibt, bleibt die Reihenfolge von a und b in Bezug zueinander unverändert, werden aber im Vergleich zu den restlichen Elementen des Arrays einsortiert. Hinweis: Der ECMAscript Standard garantiert dieses Verhalten nicht. Demzufolge berücksichtigen dies nicht alle Browser (z.B. Mozilla Versionen von 2003 und älter).
  • Wenn compareFunction(a, b) größer als 0, sortiere b auf einen niedrigeren Index als a.
  • compareFunction(a, b) muss immer denselben Wert zurückgeben, wenn dasselbe Paar an Argumenten a und b übergeben wird. Werden inkonsistente Ergebnisse zurückgegeben, ist die Sortierreihenfolge undefiniert.

Die Vergleichsfunktion hat die Form:

function compare(a, b) {
  if (a ist kleiner als b anhand von sortierkriterien) {
    return -1;
  }
  if (a ist größer als b anhand der sortierkriterien) {
    return 1;
  }
  // a muss gleich b sein
  return 0;
}

Um Nummern anstatt Strings zu vergleichen, kann die Vergleichsfunktion einfach b von a subtrahieren. Die folgende Funktion sortiert ein Array aufsteigend (sofern kein Infinity und NaN enthalten):

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

Die sort Methode kann bequem mit  function expressions (und closures) benutzt werden:

var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);

// [1, 2, 3, 4, 5]

Objekte können anhand der Werte eines ihrer Eigenschaften sortiert werden.

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic' },
  { name: 'Zeros', value: 37 }
];

// Sortierung nach Wert
items.sort(function (a, b) {
  if (a.value > b.value) {
    return 1;
  }
  if (a.value < b.value) {
    return -1;
  }
  // a muss gleich b sein
  return 0;
});

// Sortierung nach Name
items.sort(function(a, b) {
  var nameA = a.name.toUpperCase(); // ignore upper and lowercase
  var nameB = b.name.toUpperCase(); // ignore upper and lowercase
  if (nameA < nameB) {
    return -1;
  }
  if (nameA > nameB) {
    return 1;
  }

  // namen müssen gleich sein
  return 0;
});

Beispiele

Erstellen, Anzeigen und Sortieren eines Arrays

Das folgende Beispiel erstellt vier Arrays and zeigt das Original-Array an; danach die sortieren Arrays. Die numerischen Arrays werden erst ohne, dann mit Vergleichsfunktion sortiert.

var stringArray = ['Blue', 'Humpback', 'Beluga'];
var numericStringArray = ['80', '9', '700'];
var numberArray = [40, 1, 5, 200];
var mixedNumericArray = ['80', '9', '700', 40, 1, 5, 200];

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

console.log('stringArray:', stringArray.join());
console.log('Sorted:', stringArray.sort());

console.log('numberArray:', numberArray.join());
console.log('Sorted without a compare function:', numberArray.sort());
console.log('Sorted with compareNumbers:', numberArray.sort(compareNumbers));

console.log('numericStringArray:', numericStringArray.join());
console.log('Sorted without a compare function:', numericStringArray.sort());
console.log('Sorted with compareNumbers:', numericStringArray.sort(compareNumbers));

console.log('mixedNumericArray:', mixedNumericArray.join());
console.log('Sorted without a compare function:', mixedNumericArray.sort());
console.log('Sorted with compareNumbers:', mixedNumericArray.sort(compareNumbers));

Dieses Beispiel erzeugt die folgende Ausgabe. Wie die Ausgabe zeigt werden Zahlen korrekt sortiert, wenn eine Vergleichsfunktion verwendet wird. Dies gilt für Zahlen als auch für numerische Zeichenketten.

stringArray: Blue,Humpback,Beluga
Sortiert: Beluga,Blue,Humpback

numberArray: 40,1,5,200
Sortiert ohne Vergleichsfunktion: 1,200,40,5
Sortiert mit compareNumbers: 1,5,40,200

numericStringArray: 80,9,700
Sortiert ohne Vergleichsfunktion: 700,80,9
Sortiert mit compareNumbers : 9,80,700

mixedNumericArray: 80,9,700,40,1,5,200
Sortiert ohne Vergleichsfunktion: 1,200,40,5,700,80,9
Sortiert mit compareNumbers : 1,5,9,40,80,200,700

Sortierung von nicht-ASCII Zeichen

Um Strings mit nicht-ASCII Zeichen zu sortieren, d.h. Strings, die akzentierte Buchstaben  (e, é, è, a, ä, etc.), und andere Buchstaben außerhalb des Englischen Alphabets enthalten: Verwendung von String.localeCompare. Diese Funktion kann auch solche Zeichen in der richtigen Reihenfolge sortieren.

var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu'];
items.sort(function (a, b) {
  return a.localeCompare(b);
});

// items is ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']

Sortierung mit map

Die compareFunction (Vergleichsfunktion) kann mehrfach pro Element innerhalb des Arrays aufgerufen werden. Abhängig von der Beschaffenheit der compareFunction, kann dies eine große Belastung (Overhead) hervorrufen. Je mehr Arbeit eine compareFunction verrichtet und je mehr Elemente zu sortieren sind, desto angebrachter kann es sein, eine map Funktion zur Sortierung heranzuziehen. Die Idee dahinter ist, das Array einmal zu durchlaufen um die für die Sortierung zu verwendenden Aktualwerte zu ermitteln und in ein temporäres Array zu übernehmen, dieses zu sortieren und anschließend das temporäre Array zu durchlaufen um die richtige Reihenfolge herzustellen.

// the array to be sorted
var list = ['Delta', 'alpha', 'CHARLIE', 'bravo'];

// temporary array holds objects with position and sort-value
var mapped = list.map(function(el, i) {
  return { index: i, value: el.toLowerCase() };
})

// sorting the mapped array containing the reduced values
mapped.sort(function(a, b) {
  return +(a.value > b.value) || +(a.value === b.value) - 1;
});

// container for the resulting order
var result = mapped.map(function(el){
  return list[el.index];
});

Spezifikationen

Spezifikation Status Kommentar
ECMAScript 1st Edition (ECMA-262) Standard Initiale Definition.
ECMAScript 5.1 (ECMA-262)
Die Definition von 'Array.prototype.sort' in dieser Spezifikation.
Standard  
ECMAScript 2015 (6th Edition, ECMA-262)
Die Definition von 'Array.prototype.sort' in dieser Spezifikation.
Standard  
ECMAScript Latest Draft (ECMA-262)
Die Definition von 'Array.prototype.sort' in dieser Spezifikation.
Entwurf  

Browser-Kompatibilität

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 1.0 1.0 (1.7 oder früher) 5.5 (Ja) (Ja)
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Ja) (Ja) (Ja) (Ja) (Ja) (Ja)

Siehe auch

Schlagwörter des Dokuments und Mitwirkende

 Mitwirkende an dieser Seite: xerox, Huargh
 Zuletzt aktualisiert von: xerox,