Vor nicht allzu langer Zeit kam ein sehr magisches Problem in den Code meines Kollegen. Der grobe Prozess besteht darin, ein Array zu sortieren, das aus Objekten besteht, wobei Attribut A zur Sortierung verwendet wird, und Attribut B ist eine bevorzugte Bedingung. Wenn B gleich 1 entspricht, egal wie der Wert A ist, wird es zu Beginn eingestuft. Dies ist ein sehr einfaches Problem. Das Problem ist, dass er Sorte zweimal verwendet, um die Sortierung dieses Mal zu implementieren, zuerst nach dem Attribut von A zu sortieren und dann nach dem Wert von b zu sortieren. Das Problem liegt in der zweiten Sortierung.
Wir werden es für selbstverständlich halten, dass das Array in der ersten Sortierung gemäß den Attributen von a von groß nach klein sortiert wurde. Im zweiten Mal müssen wir nur die Reihenfolge des ursprünglichen Arrays (normalerweise als Rückgabe von 0 oder -1 in der Methode) verschieben und nur in Betracht ziehen, Elemente mit B gleich 1 vorne zu erwähnen. Tatsächlich hängt dies jedoch mit dem Sortieralgorithmus zusammen, der von der Sprache ausgewählt wurde. Die integrierte Sortiermethode von JavaScript (und anderen Sprachen zusammen) verwendet eine Sammlung verschiedener Sortenalgorithmen, und manchmal kann es nicht garantieren, dass die Position derselben Elemente konsistent bleibt.
Unten finden Sie ein Beispiel aus Stackoverflow
Die Codekopie lautet wie folgt:
var arraytosort = [
{Name: 'A', Stärke: 1}, {Name: 'B', Stärke: 1}, {Name: 'C', Stärke: 1}, {Name: 'D', Stärke: 1},
{Name: 'e', Stärke: 1}, {Name: 'F', Stärke: 1}, {Name: 'G', Stärke: 1}, {Name: 'H', Stärke: 1},
{Name: 'I', Stärke: 1}, {Name: 'J', Stärke: 1}, {Name: 'K', Stärke: 1}, {Name: 'L', Stärke: 1},
{Name: 'm', Stärke: 1}, {Name: 'n', Stärke: 1}, {Name: 'O', Stärke: 1}, {Name: 'P', Stärke: 1},
{Name: 'Q', Stärke: 1}, {Name: 'R', Stärke: 1}, {Name: 's', Stärke: 1}, {Name: 'T', Stärke: 1}
];
ArrayTosort.Sort (Funktion (a, b) {
return b.strength - a.strength;
});
ArrayTosort.foreach (Funktion (Element) {
console.log (element.name);
});
Wir würden denken, dass der Wert des letzten Elements immer noch von A bis T ist, aber das tatsächliche Ergebnis ist nicht in Ordnung. Dies liegt daran, dass der Sortieralgorithmus die Reihenfolge des ursprünglichen Arrays nicht beibehält, dh instabil.
Dann sollten wir versuchen, diese Situation zu vermeiden. In dem Beispiel meines Kollegen sollte die Verschmelzung der Logik zweier Sorten in einem machbaren Weg sein. Wenn es in mehrere Arten unterteilt werden muss, wird die Reihenfolge des ursprünglichen Arrays in den Attributen der Elemente aufgezeichnet.