2016-07-29 6 views
-1

Angenommen, ich habe ein Array mit den 26 Buchstaben in zufälliger Reihenfolge. Ich kann mit der Array.sort() Funktion alphabetisch sortieren. Aber wie sortiere ich, wenn ich ein bestimmtes Alphabet haben will, sage "M", das erste in der Liste zu sein, und sortiere dann alphabetisch für den Rest der Alphabete.Javascript Array-Sortierung mit bestimmten Kriterien

Momentan habe ich das "M" aus dem Array gespleißt und nach der Sortierung verschiebe ich es wieder in die Liste. Ist diese Vorgehensweise in Ordnung oder gibt es einen saubereren Weg?

Beispiel:

unsortiert: ['b','c','d','m','a']

Sortiert: ['m','a','b','c','d']

+1

Fügen Sie ein Beispiel hinzu, wie eine unsortierte Zeichenfolge und eine sortierte Zeichenfolge aussehen würden. –

+1

Ihr aktueller Ansatz scheint mir besser zu sein, als einen eigenen Sortieralgorithmus zu implementieren. – str

+0

War gerade dabei hinzuzufügen was @str sagte. –

Antwort

2

Ist diese Art und Weise in Ordnung zu tun, oder ist es eine sauberere Weg, es zu tun?

Es ist in Ordnung, aber wenn Sie möchten, können Sie die Art anpassen: Array#sort eine Funktion übernimmt, die Sie bestimmen können, in welchem ​​um zwei Einträge in sein sollte es immer wieder zum Sortieren von sort im Prozess genannt wird..

Siehe Anmerkungen:

// Create the array 
 
var theArray = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""); 
 

 
// Sort it 
 
theArray.sort(function(left, right) { 
 
    // `left` and `right` are the two entries to compare. 
 
    // We return a negative number if `left` should come before `right`, 
 
    // 0 if they're equivalent for sorting purposes, or a positive number 
 
    // if `right` should come before `left`. 
 
    // So for M to be in front of all other letters, make sure you handle 
 
    // that in the return value: 
 
    if (left === "M") { 
 
     // Is the right also "M"? 
 
     if (right === "M") { 
 
      // Yes, equivalent for sorting 
 
      return 0; 
 
     } 
 
     // No, left should come first 
 
     return -1; 
 
    } 
 
    if (right === "M") { 
 
     // Right should come first (we know `left` isn't "M") 
 
     return 1; 
 
    } 
 
    // Default comparison 
 
    return left.localeCompare(right); 
 
}); 
 

 
// Show result 
 
console.log(theArray);

1

Sie könnten einen Auftrag Objekt zum Einstellen der Priorität verwenden. später

var array = ['z', 'r', 's', 'm', 'b', 'q', 'w', 'c', 'd', 'g', 'p', 'o', 't', 'k', 'n', 'i', 'j', 'a', 'y', 'x']; 
 
array.sort(function (a, b) { 
 
    var ORDER = { m: 1, M: 1 }; 
 
    return !ORDER[a] - !ORDER[b] || a.localeCompare(b); 
 

 
}); 
 
    
 
console.log(array);

+0

Was wäre, wenn Sie mehr Dinge in der Reihenfolge angeben möchten: '{m: 1, M: 1, x: 2, w: 3}' – nnnnnn

+0

Sie könnten etwas nehmen wie '(ORDER [a.status] || 0) - (ORDER [b.status] || 0); 'mit einem korrekten Wert des Nullstandards, abhängig von der gewünschten Priorität. –

+0

OK; nette Idee ... – nnnnnn

-1

Neben einem benutzerdefinierten Komparator an die Sortierfunktion von der Anwendung, können Sie nur die Zeichen bewegen.

var a = ['b','c','d','m','a']; 
 
var b = a.sort(); 
 
var c = ["m",...b.join``.replace("m","")]; 
 
console.log(c);

b.join`` wandelt das Array in die Zeichenfolge, .replace("m","") entfernt m, ... wandelt in die String-Array zurück (das ist die spread operator) und verkettet "m" damit.

+0

Warum der Downvote? Was habe ich falsch verstanden? Meine Antwort scheint die richtige Ausgabe zu produzieren, nein? – nicael

+0

dv nicht von mir, aber es ist nicht sortieren, sondern wieder zusammenbauen. –

+0

Es ist nur kürzer und einfacher zu verstehen. Es ist genau ein "sauberer" Weg. – nicael

0

Hier ist eine Lösung, die gut skaliert, wenn Sie mehr Fälle und nicht nur einen Buchstaben benötigen:

var alfabetPriority = "mabcdefghijklnopqrstuvwxyz"; 
 
var letters = ['b','c','d','m','a']; 
 

 
letters.sort(function(left, right) { 
 
    return alfabetPriority.indexOf(left) - alfabetPriority.indexOf(right); 
 
}); 
 

 
console.info(letters.join(',')); // gives: m,a,b,c,d

Was hier geschieht, die die Zeichen wurden Sortierung basierend auf ihren Index in der Prioritätenliste. Dies würde mit jedem UTF-8-Zeichen funktionieren. Sie können die Priorität beliebig ändern, auch für mehrere Buchstaben.

Das gleiche Prinzip würde gelten, wenn Sie Wörter sortieren würden. In diesem Fall hätten Sie eine Reihe von Wörtern, die die Priorität und nicht eine Zeichenfolge angeben.

Der Nachteil ist möglicherweise die Leistung, aber wenn Sie dies nicht Tausende Male mit einer riesigen Liste von Zeichen tun, die sortiert werden müssen, werden Sie den Unterschied nicht bemerken.

+1

* "Die Antwort ist bisher nicht gut skalierbar ..." * Die obigen Skalen sind schlimmer als jede andere Antwort, indem die Zeichenfolge wiederholt mit 'indexOf' durchsucht wird. Da "M" fest codiert ist: Das wurde vom OP festgelegt. –

+0

Skalierung als Lösung, nicht Leistung @ T.J.Crowder. Für jeden Brief, der eine andere Priorität benötigt, muss der Code nicht mit einer 'if-else'-Konstruktion geändert werden. –

+0

Okay. Das OP hat darum gebeten, * eine * Sache etwas Besonderes zu machen, also ist es vernünftig (und nicht entfernt "nicht nützlich") Antworten darauf zu beantworten. –