2013-10-17 2 views
30

Ich versuche, ein Array von Objekten mit jedem Objekt zu sortierenWie nach dem Datum eine Javascript-Array von Objekten sortieren

var recent = [{id: "123",age :12,start: "10/17/13 13:07"} , {id: "13",age :62,start: "07/30/13 16:30"}]; 

Datumsformat enthalten ist: mm/dd/yy hh:mm

ich nach dem Aufnahmedatum sortiert werden soll mit dem neuesten zuerst. Wenn das Datum gleich ist, sollte es rechtzeitig sortiert werden.

Ich habe die folgende Sortierfunktion ausprobiert. Aber es funktioniert nicht.

recent.sort(function(a,b)) 
{ 
    a = new Date(a.start); 
    b = new Date(b.start); 
    return a-b; 
}); 

Auch, wie soll ich durch die Objekte iterieren zum Sortieren? Etwas wie:

for (var i = 0; i < recent.length; i++) 
    { 
     recent[i].start.sort(function (a, b) 
     { 
      a = new Date(a.start); 
      b = new Date(b.start); 
      return a-b; 
     }); 
    } 

Es kann eine beliebige Anzahl von Objekten im Array geben.

+1

Ihr 'letzter' Literal ist falsch. –

+2

Erster Block ist nicht gültig Javascript – SheetJS

+1

Zuletzt ist der Name meines Arrays von Objekten. Kannst du bitte etwas ausarbeiten? – Anthea

Antwort

49

Wie in den Kommentaren darauf hingewiesen wurde, ist die Definition der letzten nicht korrekt Javascript.

Aber angenommen, die Daten sind Strings:

var recent = [ 
    {id: 123,age :12,start: "10/17/13 13:07"}, 
    {id: 13,age :62,start: "07/30/13 16:30"} 
]; 

dann sortieren wie folgt aus:

recent.sort(function(a,b) { 
    return new Date(a.start).getTime() - new Date(b.start).getTime() 
}); 

More details on sort function from W3Schools

+1

Sie können einige nützliche Antworten zu diesem Thema hier finden: ** [Sortieren Sie Javascript-Objekt-Array nach Datum] (http://stackoverflow.com/a/26759127/2247494) ** – jherax

+1

** Hinweis **: nicht vergessen die explizite "return" Deklaration – pruett

+2

Ich denke, Sie brauchen nicht die 'getTime()' oder keine –

5
recent.sort(function(a,b) { return new Date(a.start).getTime() - new Date(b.start).getTime() }); 
+3

Die Vergleichsfunktion soll negative, 0 oder positive zurückgeben, abhängig von der Beziehung zwischen den Argumenten, nicht ein Boolean. – Barmar

+0

Gut entdeckt, ich habe meine Antwort aktualisiert. –

+0

Das Subtrahieren von Date-Objekten gibt scheinbar das gleiche wie das Subtrahieren ihrer 'getTime()' -Werte zurück, obwohl ich diese Anforderung in keiner Spezifikation finden kann. – Barmar

0

Diese Funktion ermöglicht es Ihnen, einen Komparator zu schaffen, die einen Pfad zu der Fuß wird Schlüssel, den Sie gerne vergleichen würden:

function createDateComparator (path = [] , comparator = (a, b) => a.getTime() - b.getTime()) { 
 
    return (a, b) => { 
 
    let _a = a 
 
    let _b = b 
 
    for(let key of path) { 
 
     _a = _a[key] 
 
     _b = _b[key] 
 
    } 
 
    return comparator(_a, _b) 
 
    } 
 
} 
 

 

 
const input = (
 
    [ { foo: new Date(2017, 0, 1) } 
 
    , { foo: new Date(2018, 0, 1) } 
 
    , { foo: new Date(2016, 0, 1) } 
 
    ] 
 
) 
 

 
const result = input.sort(createDateComparator([ 'foo' ])) 
 

 
console.info(result)