2010-05-13 14 views
6

Wie würden Sie ein mehrdimensionales Array in JavaScript sortieren?Ein mehrdimensionales Array in JavaScript sortieren

Ich habe ein Array voller Arrays, die zwei Daten und eine Zeichenfolge enthalten. Ich brauche das Haupt-Array nach einem der Datums-Arrays sortiert, ist das möglich?

Daten stucture:

events = [ 
{ date 1, date 2, string }, 
{ date 2, date 2, string }, 
] 

Antwort

13

Duplizieren von sort outer array based on values in inner array, javascript finden Sie einige Antworten, wie meine eigenen

var arr = [.....] 
arr.sort((function(index){ 
    return function(a, b){ 
     return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 : 1)); 
    }; 
})(2)); // 2 is the index 

This Sorten auf Index finden 2

+0

+1 Ich weiß, das ist ein alter Beitrag, aber es ist eine tolle Antwort und es hat mir geholfen, ein Problem mit meinem eigenen benutzerdefinierten Tabellensortier-Plugin zu knacken :) – defaultNINJA

3

Die Array-Struktur scheint ein wenig vage aus Ihrer Beschreibung. Sie können eine benutzerdefinierte Sortierfunktion verwenden, um Elemente zu vergleichen und die Sortierung durchzuführen.

die Struktur Unter der Annahme:

var data = [ 
    [date11, date12, string], 
    [date21, date22, string], 
    [date31, date32, string], 
    ... 
]; 

Wenn Sie Objekte anstelle von verschachtelten Arrays hätten, würden Sie nicht die Nummer Indizes verwenden müssen. Hier werden a[0] und b[0] verwendet, um das erste Element in zwei verschachtelten Arrays zu vergleichen (unter der Annahme, dass es das Datum ist, nach dem sortiert werden soll). Wenn Sie davon ausgehen, dass a [0] und b [0] bereits Objekte von Date sind, müssen Sie möglicherweise die Date-Objekte erstellen, wenn sie nicht bereits vorhanden sind.

Update: Danke an @maerics für den Hinweis. Der Rückgabewert des Komparators muss [negativ, 0, positiv] sein, entsprechend den Werten [a < b, a == b, a> b].

function sortByDate(a, b) { 
    return a[0].getTime() - b[0].getTime(); 
} 

data.sort(sortByDate); 
+2

Wahrscheinlich meinst du 'return a [0] .getTime() - b [0] .getTime()' weil der Vergleicher (neg, null, pos) abhängig von if (a b), oder? – maerics

+0

Ja, danke für die Korrektur :) – Anurag

+0

Kein Punkt in der Verwendung von getTime(). a - b führt dazu, dass a.valueOf() und b.valueOf() hinter den Kulissen verwendet werden, was die Unix-Zeit zurückgibt. –

1

In diesem Beispiel werden Arrays nach Zahlen (und Datumsangaben) oder Strings sortiert.

Array.prototype.deepsort= function(){ 
    var i, order= arguments, L= order.length, tem; 
    return this.sort(function(a, b){ 
     i= 0; 
     while(i < L){ 
      tem= order[i++]; 
      var ao= a[tem] || 0, bo= b[tem] || 0; 
      if(ao== bo) continue; 
      return ao> bo? 1: -1; 
     } 
     return 0; 
    }); 
} 

var a= [ [ 'z', 1, 0 ], [ 'a', 0, 1 ],['m',-1,10] ,['a','1',-1]]; 

alert(a.deepsort(0,1,2)+'\n\n'+a.deepsort(2,0,1)) 

Sortiert nach dem ausgewählten Index (übergeben als Argument).

Wenn die Elemente in diesem Index in jedem Array übereinstimmen, sortiert den nächsten als Argument übergebenen Index, falls vorhanden.

Weiter so lange die Elemente übereinstimmen und es gibt mehr Argumente.

Sie müssen hier nicht mehr als einen Index angeben zu sortieren, indem

a.deepsort(0); 
a.deepsort(2); 
+0

Funktioniert in Chrome großartig. 'this.sort' gibt einen Fehler in Firefox aus. –

Verwandte Themen