Hallo hmm,
wenn Du auf Eigenschaften eines Objekts zugreifen willst, deren Namen Du erst zur Laufzeit kennst, geht das mit der Array-Notation. Das kann man auch kombinieren, falls das Objekt in einem Array steht.
let datas = [
{x: a1, y: a2, z:a3, k: a4},
{x: a1, y: a2, z:a3, k: a4},
{x: a1, y: a2, z:a3, k: a4}
];
let row = 1;
let property = "y";
console.log("Wert von " + property +
" in Zeile " + row +
" ist " + datas[row][property]);
Eine Callback-Funktion für Sort bekommt immer zwei dieser Objekte als Parameter übergeben und muss -1, 0 oder 1 zurückgeben, je nachdem, ob Parameter 1 als kleiner, gleich oder größer angesehen werden soll als Parameter 2. Um den Propertynamen in die Callbackfunktion hineinzubekommen, gibt es den traditionellen Weg mit einer globalen Variablen (bzw. einer Eigenschaft im Objekt, wie im Wiki-Artikel), oder den modernen, funktionalen Weg mit einer Closure. Du schreibst eine Funktion, die Dir die Callback-Funktion zurückgibt:
function getComparerFor(property) {
return function(a, b) {
if (a[property] < b[property]) return -1;
if (a[property] > b[property]) return 1;
return 0;
}
}
Diese Funktion gibt eine anonyme Funktion zurück, die als Sortierer dient. Der Trick ist, dass Funktionen mehr als nur Funktionen sind. Sie schließen immer auch den Kontext in sich ein (daher der Name Closure), in dem sie definiert wurden. In diesem Fall gehört dazu auch der property-Parameter und sein Wert.
Wenn deine Werte alphanumerisch sind, guck nochmal in den Wiki-Artikel, da wird localCompare verwendet um korrekt für die Anwendersprache zu sortieren.
Das verwendest Du so:
let sortierer = getComparerFor(sortierSpalte);
datas.sort(sortierer);
datas.sort(getComparerFor(sortierSpalte));
wobei zu beachten ist, dass das datas-Array dabei umsortiert wird. Wenn Du die vom Server gelieferte Reihenfolge in datas beibehalten willst, musst Du datas vorher klonen. Das geht mit Array.from() - außer in Alt-Browsern, dort brauchst Du für Array.from einen Polyfill. Der im MDN ist lang, aber erfüllt die Spec. Den kannst Du zur Sicherheit einbauen (oder auf den IE pfeifen, oder eine eigene kleine Funktion zum flachen Klonen eines Arrays schreiben).
Das verwendest Du dann so:
var sortedData = Array.from(datas);
var sortierer = getComparerFor(sortierSpalte);
sortedData.sort(sortierer);
var sortedData = Array.from(datas).sort(getComparerFor(sortierSpalte))
Rolf
--
sumpsi - posui - clusi