2013-10-17 5 views
30

Sto cercando di ordinare un array di oggetti con ogni oggetto contenentecome ordinare un array JavaScript di oggetti per data

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

formato della data è: mm/dd/yy hh:mm

voglio ordinare in ordine di data con il più recente per primo. Se la data è la stessa dovrebbe essere ordinata in tempo.

Ho provato la funzione di ordinamento seguente. Ma non sta funzionando.

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

Inoltre, come devo scorrere tra gli oggetti per l'ordinamento? Qualcosa di simile:

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; 
     }); 
    } 

Ci può essere un qualsiasi numero di oggetti nella matrice.

+1

Il letterale 'recent' è errato. –

+2

Primo blocco non valido javascript – SheetJS

+1

recente è il nome della mia matrice di oggetti. Puoi per favore elaborare? – Anthea

risposta

49

Come è stato sottolineato nei commenti, la definizione di recente non è corretta javascript.

ma assumendo le date stringhe:

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

quindi ordinare in questo modo:

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

More details on sort function from W3Schools

+1

Qui puoi trovare alcune risposte utili a questo argomento: ** [Ordina oggetto JavaScript per data] (http://stackoverflow.com/a/26759127/2247494) ** – jherax

+1

** nota **: non dimenticare la dichiarazione esplicita 'return' – pruett

+2

Penso che tu non abbia bisogno di' getTime() 'o no –

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

La funzione di confronto dovrebbe restituire un valore negativo, 0 o positivo a seconda della relazione tra gli argomenti, non di un valore booleano. – Barmar

+0

Ben avvistato, ho aggiornato la mia risposta. –

+0

Gli oggetti Date di sottrazione apparentemente restituiscono la stessa cosa che sottraendo i loro valori 'getTime()', anche se non riesco a trovare questo requisito in nessuna specifica. – Barmar

0

Questa funzione consente di creare un comparatore che vi guiderà un percorso per il chiave che si desidera confrontare su:

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)