Ist es möglich, ein Array zu sortieren und neu anzuordnen, das so aussieht:
itemsArray = [
['Anne', 'a'],
['Bob', 'b'],
['Henry', 'b'],
['Andrew', 'd'],
['Jason', 'c'],
['Thomas', 'b']
]
passend zur Anordnung dieses Arrays:
sortingArr = [ 'b', 'c', 'b', 'b', 'a', 'd' ]
Leider habe ich keine IDs, die ich nachverfolgen könnte. Ich müsste das Items-Array priorisieren, um dem sortingArr so nahe wie möglich zu kommen.
Aktualisieren:
Hier ist die Ausgabe, die ich suche:
itemsArray = [
['Bob', 'b'],
['Jason', 'c'],
['Henry', 'b'],
['Thomas', 'b']
['Anne', 'a'],
['Andrew', 'd'],
]
Irgendeine Idee, wie das gemacht werden kann?
javascript
user1448892
quelle
quelle
Antworten:
Etwas wie:
Hier ist ein kürzerer Code, der jedoch das
sorting
Array zerstört :quelle
Einzeilige Antwort.
quelle
itemsArray
. Abhängig von den Leistungsanforderungen wäre dies viel sichereritemsArray.slice().sort(...)
.sortingArr
bei der alle Werte in enthalten sein müssenitemsArray
. Die Lösung besteht darin, Elemente an die Rückseite des Arrays zu verschieben, wenn sie nicht vorhanden sind insortingArr
:allProducts.sort((product1, product2) => { const index1 = manualSort.indexOf(product1.id); const index2 = manualSort.indexOf(product2.id); return ( (index1 > -1 ? index1 : Infinity) - (index2 > -1 ? index2 : Infinity) ); });
Wenn Sie die native Array-Sortierfunktion verwenden, können Sie einen benutzerdefinierten Komparator übergeben, der beim Sortieren des Arrays verwendet wird. Der Komparator sollte eine negative Zahl zurückgeben, wenn der erste Wert kleiner als der zweite ist, Null, wenn sie gleich sind, und eine positive Zahl, wenn der erste Wert größer ist.
Wenn ich das Beispiel, das Sie geben, richtig verstehe, können Sie Folgendes tun:
quelle
indexOf
der erste Index zurückgegeben wird.sortingArr
eindeutig sind - was sie zum Glück in meinem Fall sind :)sortingArray
Außenseite der Funktion deklarieren, um sie bei jederFall 1: Originalfrage (keine Bibliotheken)
Viele andere Antworten, die funktionieren. :) :)
Fall 2: Ursprüngliche Frage (Lodash.js oder Underscore.js)
Fall 3: Sortieren Sie Array1 so, als wäre es Array2
Ich vermute, dass die meisten Leute hierher gekommen sind, um nach einem Äquivalent zu array_multisort von PHP zu suchen (ich habe es getan), also dachte ich, ich würde diese Antwort auch posten. Es gibt einige Möglichkeiten:
1. Es gibt eine JS-Implementierung von array_multisort () . Vielen Dank an @Adnan für den Hinweis in den Kommentaren. Es ist jedoch ziemlich groß.
2. Schreiben Sie Ihre eigenen. ( JSFiddle-Demo )
3. Lodash.js oder Underscore.js (beide beliebte, kleinere Bibliotheken, die sich auf die Leistung konzentrieren) bieten tun können:
... die (1) das sortArray in
[index, value]
Paare gruppiert , (2) sie nach dem Wert sortiert (Sie können hier auch einen Rückruf bereitstellen), (3) jedes der Paare durch das Element aus dem itemArray am Index der ersetzt Paar entstand aus.quelle
Dies ist wahrscheinlich zu spät, aber Sie können auch eine modifizierte Version des folgenden Codes im ES6-Stil verwenden. Dieser Code ist für Arrays wie:
Die eigentliche Operation:
Der tatsächliche Betrieb in ES5:
Sollte dazu führen
arrayToBeSorted = [3,5]
Zerstört das Referenzarray nicht.
quelle
[{name: "1"}, {name: "2"}, {name: "3"}, ...]
.Ich würde ein Zwischenobjekt (
itemsMap
) verwenden, um quadratische Komplexität zu vermeiden:Siehe http://jsfiddle.net/eUskE/
quelle
http://jsfiddle.net/s7b2P/
Resultierende Reihenfolge: Bob, Jason, Henry, Thomas, Anne, Andrew
quelle
Warum nicht so etwas
Die Kartenfunktion ist möglicherweise nicht in allen Versionen von verfügbar
Javascript
quelle
quelle
Dies ist, wonach ich gesucht habe und was ich getan habe, um ein Array von Arrays basierend auf einem anderen Array zu sortieren:
quelle
Ich musste dies für eine JSON-Nutzlast tun, die ich von einer API erhalte, aber es war nicht in der Reihenfolge, in der ich es wollte.
Array ist das Referenzarray, das zweite Array, sortiert nach:
Ich habe diese als Objekte gemacht, weil diese irgendwann andere Eigenschaften haben werden.
Erstelltes Array:
Wird mit der Ergebnismenge aus der Datenbank verwendet. Ich weiß nicht, wie effizient es ist, aber mit den wenigen Spalten, die ich verwendet habe, hat es gut funktioniert.
quelle
Um ein neues geordnetes Array zu erhalten, können Sie ein
Map
Element nehmen und alle Elemente mit dem gewünschten Schlüssel in einem Array sammeln und die gewünschten geordneten Schlüssel zuordnen, indem Sie das gesiebte Element der gewünschten Gruppe verwenden.quelle
{}
anstelle vonMap
🤷♂️Diese Lösung hängt die Objekte am Ende an, wenn der Sortierschlüssel nicht im Referenzarray vorhanden ist
quelle
das sollte funktionieren:
quelle
Sie könnten diese Methode ausprobieren.
quelle
ES6
Weitere Beispiele mit verschiedenen Eingabearrays
quelle
Für den Fall, dass Sie hierher kommen und dies mit einer Reihe von Objekten tun müssen, finden Sie hier eine Adaption von @Durgpal Singhs großartiger Antwort:
quelle
Verwenden Sie die $ .inArray () -Methode von jQuery. Sie könnten dann so etwas tun
quelle
Verwenden Sie den Schnittpunkt zweier Arrays.
Ex:
=> ['a', 'b', 'e']
Wenn 'z' und 's' außerhalb des Bereichs des ersten Arrays liegen, hängen Sie es am Ende des Ergebnisses an
quelle
Sie können so etwas tun:
Sie können es hier testen .
Hinweis: Dies setzt voraus, dass die von Ihnen übergebenen Arrays gleich groß sind. Wenn dies nicht der Fall ist, müssen Sie einige zusätzliche Überprüfungen hinzufügen.
siehe Link
verweisen
quelle