Sagen, ich habe eine Reihe von Person-Objekte:Sortierung ein Array durch den Inhalt eines anderen in JavaScript
var people = [{name: "Joe Schmo", age: 36}, {name: "JANE DOE", age: 40}];
und ich habe eine Funktion, die unsensibel ein Array von Strings Fall sortieren:
function caseInsensitiveSort(arr) { ... }
Gibt es eine einfache Möglichkeit, meine vorhandene Sortierfunktion mit Array.prototype.map
zu kombinieren, um das Array people
mit dem Schlüssel name
zu sortieren?
I.e. es würde produzieren
var people = [{name: "JANE DOE", age: 40}, {name: "Joe Schmo", age: 36}];
es von Hand tun nicht schwer, in diesem besonderen Fall ist,
people.sort(function (a, b) {
return a.name.localeCompare(b.name);
});
aber ich kann nicht denken Sie an einen Weg, es zu tun, die mir die prä- zu verwenden erlauben würde vorhandene Sortierfunktion. In einem Fall, in dem die Sortierfunktion mehr angepasst ist, wäre dies nützlich.
Edit: Ich glaube, dass das Kernproblem hier ist, dass, um dies gut zu machen, Sie herausfinden müssen, was die ursprünglichen Indizes zugeordnet wurden, wenn Sie das Proxy-Array sortieren. Diese neuen Indizes mit der systemeigenen sort
-Funktion zu erhalten, scheint im allgemeinen Fall nicht möglich zu sein. Aber ich würde mich freuen, falsch bewiesen zu werden.
Edit: Die Art, wie ich das versuchte, ist zu ineffizient, um nützlich zu sein. Siehe die Antwort unten für die Lösung, die stattdessen eine Vergleichsfunktion verwendet.
Wenn "caseInsensitiveSort" ein Array akzeptiert, müssten Sie ein Array der Namen an diese Funktion übergeben, die Namen sortieren und dann das Array mit den Objekten basierend auf dem Array mit den Namen sortieren. Klingt nach einer wirklich komplizierten Art, etwas Einfaches zu tun. – adeneo
Wird es mit wenigen Elementen umgehen? Da die Methode 'Array.prototype.map' ein neues Array erstellt, ist es bei Millionen von Datensätzen am besten, sie direkt zu sortieren. –
@adeneo @Jordan Sie sind beide richtig. Wie xdazz unten ausgeführt hat, besteht die richtige Methode, dies effizient zu tun, darin, die Logik meines Vergleichs in eine separate Funktion zu abstrahieren und diese an "Array.prototype.sort" zu liefern, anstatt zu versuchen, meine Sortierfunktion einzukeilen. –