Ordina matrice di oggetti Javascript per data

Supponiamo che io abbia una matrice di pochi oggetti:

var array = [{id: 1, date: Mar 12 2012 10:00:00 AM}, {id: 2, date: Mar 8 2012 08:00:00 AM}]; 

Come posso ordinare questo array in base all’elemento date in ordine dalla data più vicina alla data e al tempo corrente? Tieni presente che l’array può avere molti oggetti, ma per semplicità ho usato 2.

Dovrei usare la funzione di ordinamento e un comparatore personalizzato?

AGGIORNARE

Nel mio caso specifico, volevo che le date fossero organizzate dal più recente al più vecchio. Alla fine ho dovuto invertire la logica della funzione semplice in questo modo:

 array.sort(function(a, b) { a = new Date(a.dateModified); b = new Date(b.dateModified); return a>b ? -1 : a<b ? 1 : 0; }); 

Ordina le date dal più recente.

La risposta più semplice

 array.sort(function(a,b){ // Turn your strings into dates, and then subtract them // to get a value that is either negative, positive, or zero. return new Date(b.date) - new Date(a.date); }); 

Risposta più generica

 array.sort(function(o1,o2){ if (sort_o1_before_o2) return -1; else if(sort_o1_after_o2) return 1; else return 0; }); 

O più tersamente:

 array.sort(function(o1,o2){ return sort_o1_before_o2 ? -1 : sort_o1_after_o2 ? 1 : 0; }); 

Risposta generica e potente

Definisci una funzione di sortBy non sortBy utilizzando una trasformazione di Schwartzian su tutti gli array:

 (function(){ if (typeof Object.defineProperty === 'function'){ try{Object.defineProperty(Array.prototype,'sortBy',{value:sb}); }catch(e){} } if (!Array.prototype.sortBy) Array.prototype.sortBy = sb; function sb(f){ for (var i=this.length;i;){ var o = this[--i]; this[i] = [].concat(f.call(o,o,i),o); } this.sort(function(a,b){ for (var i=0,len=a.length;i 

Usalo in questo modo:

 array.sortBy(function(o){ return o.date }); 

Se la tua data non è direttamente confrontabile, crea una data comparabile, ad es

 array.sortBy(function(o){ return new Date( o.date ) }); 

Puoi anche usarlo per ordinare secondo più criteri se restituisci un array di valori:

 // Sort by date, then score (reversed), then name array.sortBy(function(o){ return [ o.date, -o.score, o.name ] }; 

Vedi http://phrogz.net/JS/Array.prototype.sortBy.js per maggiori dettagli.

Le risposte @Phrogz sono entrambe fantastiche, ma qui c’è una risposta grande, più concisa:

 array.sort(function(a,b){return a.getTime() - b.getTime()}); 

trovato qui: Ordina data in Javascript

Dopo aver corretto il JSON questo dovrebbe funzionare.

 var array = [{id: 1, date:'Mar 12 2012 10:00:00 AM'},{id: 2, date:'Mar 8 2012 08:00:00 AM'}]; array.sort(function(a,b){ var c = new Date(a.date); var d = new Date(b.date); return cd; }); 

I tuoi dati necessitano di alcune correzioni:

 var array = [{id: 1, date: "Mar 12 2012 10:00:00 AM"},{id: 2, date: "Mar 28 2012 08:00:00 AM"}]; 

Dopo aver corretto i dati, puoi usare questo pezzo di codice:

 function sortFunction(a,b){ var dateA = new Date(a.date).getTime(); var dateB = new Date(b.date).getTime(); return dateA > dateB ? 1 : -1; }; var array = [{id: 1, date: "Mar 12 2012 10:00:00 AM"},{id: 2, date: "Mar 28 2012 08:00:00 AM"}]; array.sort(sortFunction);​ 

Raccomando GitHub: Array sortBy – una migliore implementazione del metodo sortBy che utilizza la trasformazione di Schwartz

Ma per ora proveremo questo approccio Gist: sortBy-old.js .
Creiamo un metodo per ordinare gli array che sono in grado di disporre gli oggetti secondo alcune proprietà.

Creazione della funzione di ordinamento

 var sortBy = (function () { var toString = Object.prototype.toString, // default parser function parse = function (x) { return x; }, // gets the item to be sorted getItem = function (x) { var isObject = x != null && typeof x === "object"; var isProp = isObject && this.prop in x; return this.parser(isProp ? x[this.prop] : x); }; /** * Sorts an array of elements. * * @param {Array} array: the collection to sort * @param {Object} cfg: the configuration options * @property {String} cfg.prop: property name (if it is an Array of objects) * @property {Boolean} cfg.desc: determines whether the sort is descending * @property {Function} cfg.parser: function to parse the items to expected type * @return {Array} */ return function sortby (array, cfg) { if (!(array instanceof Array && array.length)) return []; if (toString.call(cfg) !== "[object Object]") cfg = {}; if (typeof cfg.parser !== "function") cfg.parser = parse; cfg.desc = !!cfg.desc ? -1 : 1; return array.sort(function (a, b) { a = getItem.call(cfg, a); b = getItem.call(cfg, b); return cfg.desc * (a < b ? -1 : +(a > b)); }); }; }()); 

Impostazione dei dati non ordinati

 var data = [ {date: "2011-11-14T17:25:45Z", quantity: 2, total: 200, tip: 0, type: "cash"}, {date: "2011-11-14T16:28:54Z", quantity: 1, total: 300, tip: 200, type: "visa"}, {date: "2011-11-14T16:30:43Z", quantity: 2, total: 90, tip: 0, type: "tab"}, {date: "2011-11-14T17:22:59Z", quantity: 2, total: 90, tip: 0, type: "tab"}, {date: "2011-11-14T16:53:41Z", quantity: 2, total: 90, tip: 0, type: "tab"}, {date: "2011-11-14T16:48:46Z", quantity: 2, total: 90, tip: 0, type: "tab"}, {date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "visa"}, {date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"}, {date: "2011-11-14T16:58:03Z", quantity: 2, total: 90, tip: 0, type: "tab"}, {date: "2011-11-14T16:20:19Z", quantity: 2, total: 190, tip: 100, type: "tab"}, {date: "2011-11-14T17:07:21Z", quantity: 2, total: 90, tip: 0, type: "tab"}, {date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0, type: "cash"} ]; 

Usandolo

Infine, sistemiamo l’array, per proprietà "date" come string

 //sort the object by a property (ascending) //sorting takes into account uppercase and lowercase sortBy(data, { prop: "date" }); 

Se si desidera ignorare la lettera, impostare il callback "parser" :

 //sort the object by a property (descending) //sorting ignores uppercase and lowercase sortBy(data, { prop: "date", desc: true, parser: function (item) { //ignore case sensitive return item.toUpperCase(); } }); 

Se si desidera trattare il campo “data” come tipo di Date :

 //sort the object by a property (ascending) //sorting parses each item to Date type sortBy(data, { prop: "date", parser: function (item) { return new Date(item); } }); 

Qui puoi giocare con l’esempio precedente:
jsbin.com/lesebi

Potresti usare sortBy nel carattere di sottolineatura js.

http://underscorejs.org/#sortBy

Campione:

 var log = [{date: '2016-01-16T05:23:38+00:00', other: 'sample'}, {date: '2016-01-13T05:23:38+00:00',other: 'sample'}, {date: '2016-01-15T11:23:38+00:00', other: 'sample'}]; console.log(_.sortBy(log, 'date')); 

Questo dovrebbe accadere quando la tua data è in questo formato (gg / mm / aaaa).

  sortByDate(arr) { arr.sort(function(a,b){ return Number(new Date(a.readableDate)) - Number(new Date(b.readableDate)); }); return arr; } 

sortByDate(myArr);

Ho intenzione di aggiungere questo qui, in quanto alcuni usi potrebbero non essere in grado di capire come invertire questo metodo di ordinamento.

Per ordinare per “coming up”, possiamo semplicemente scambiare un & b, in questo modo:

 your_array.sort ( (a, b) => { return new Date(a.DateTime) - new Date(b.DateTime); }); 

Notare che a è ora sul lato sinistro, e b è sulla destra,: D!

puoi anche usare questo link . fornisce funzioni di callback che possono essere passate alla funzione di sort()

Sono stato in grado di ottenere l’ordinamento usando le seguenti linee:

 array.sort(function(a, b) { if (a.AffiliateDueDate > b.AffiliateDueDate) return 1; if (a.AffiliateDueDate < b.AffiliateDueDate) return -1; }) 

Per chiunque desideri ordinare per data (formato UK), ho usato quanto segue:

 //Sort by day, then month, then year for(i=0;i<=2; i++){ dataCourses.sort(function(a, b){ a = a.lastAccessed.split("/"); b = b.lastAccessed.split("/"); return a[i]>b[i] ? -1 : a[i] 

Ho appena preso la trasformata Schwartziana raffigurata sopra e fatta come funzione. Prende un array , la function ordinamento e un booleano come input:

 function schwartzianSort(array,f,asc){ for (var i=array.length;i;){ var o = array[--i]; array[i] = [].concat(f.call(o,o,i),o); } array.sort(function(a,b){ for (var i=0,len=a.length;i 
 function schwartzianSort(array, f, asc) { for (var i = array.length; i;) { var o = array[--i]; array[i] = [].concat(f.call(o, o, i), o); } array.sort(function(a, b) { for (var i = 0, len = a.length; i < len; ++i) { if (a[i] != b[i]) return a[i] < b[i] ? asc ? -1 : 1 : 1; } return 0; }); for (var i = array.length; i;) { array[--i] = array[i][array[i].length - 1]; } return array; } arr = [] arr.push({ date: new Date(1494434112806) }) arr.push({ date: new Date(1494434118181) }) arr.push({ date: new Date(1494434127341) }) console.log(JSON.stringify(arr)); arr = schwartzianSort(arr, function(o) { return o.date }, false) console.log("DESC", JSON.stringify(arr)); arr = schwartzianSort(arr, function(o) { return o.date }, true) console.log("ASC", JSON.stringify(arr)); 

Se come me hai un array con date formattate come YYYY[-MM[-DD]] dove desideri ordinare date più specifiche prima di quelle meno specifiche, ho trovato questa comoda funzione:

 const sortByDateSpecificity = (a, b) => { const aLength = a.date.length const bLength = b.date.length const aDate = a.date + (aLength < 10 ? '-12-31'.slice(-10 + aLength) : '') const bDate = b.date + (bLength < 10 ? '-12-31'.slice(-10 + bLength) : '') return new Date(aDate) - new Date(bDate) } 
 Adding absolute will give better results var datesArray =[ {"some":"data1","date": "2018-06-30T13:40:31.493Z"}, {"some":"data2","date": "2018-07-04T13:40:31.493Z"}, {"some":"data3","date": "2018-06-27T13:40:54.394Z"} ] var sortedJsObjects = datesArray.sort(function(a,b){ return Math.abs(new Date(a.date) - new Date(b.date)) });