Digamos que tengo una matriz de algunos objetos:
var array = [{id: 1, date: Mar 12 2012 10:00:00 AM}, {id: 2, date: Mar 8 2012 08:00:00 AM}];
¿Cómo puedo ordenar esta matriz por el elemento de fecha en orden desde la fecha más cercana a la fecha y hora actual hacia abajo? Tenga en cuenta que la matriz puede tener muchos objetos, pero por simplicidad usé 2.
¿Usaría la función de clasificación y un comparador personalizado?
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); });
array.sort(function(o1,o2){ if (sort_o1_before_o2) return -1; else if(sort_o1_after_o2) return 1; else return 0; });
O más escuetamente:
array.sort(function(o1,o2){ return sort_o1_before_o2 ? -1 : sort_o1_after_o2 ? 1 : 0; });
Defina una función sortBy
personalizada no enumerable usando una transformación Schwartzian en todas las matrices:
(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<len;++i){ if (a[i]!=b[i]) return a[i]<b[i]?-1:1; } return 0; }); for (var i=this.length;i;){ this[--i]=this[i][this[i].length-1]; } return this; } })();
Úsalo así:
array.sortBy(function(o){ return o.date });
Si su fecha no es directamente comparable, haga una fecha comparable a partir de ella, por ejemplo
array.sortBy(function(o){ return new Date( o.date ) });
También puede usar esto para ordenar por múltiples criterios si devuelve una matriz de valores:
// Sort by date, then score (reversed), then name array.sortBy(function(o){ return [ o.date, -o.score, o.name ] };
Consulte http://phrogz.net/JS/Array.prototype.sortBy.js para obtener más detalles.
Después de corregir el JSON, esto debería funcionar para usted ahora:
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; });
Sus datos necesitan algunas correcciones:
var array = [{id: 1, date: "Mar 12 2012 10:00:00 AM"},{id: 2, date: "Mar 28 2012 08:00:00 AM"}];
Después de corregir los datos, puede usar este fragmento de código:
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);
Las respuestas de @Phrogz son excelentes, pero aquí hay una respuesta excelente y más concisa:
array.sort(function(a,b){return a.getTime() - b.getTime()});
Usando la forma de función de flecha
array.sort((a,b)=>a.getTime()-b.getTime());
encontrado aquí: Ordenar fecha en Javascript
Voy a agregar esto aquí, ya que es posible que algunos usos no puedan resolver cómo invertir este método de clasificación.
Para ordenar por 'aparecer', simplemente podemos intercambiar a & b, así:
your_array.sort ( (a, b) => { return new Date(a.DateTime) - new Date(b.DateTime); });
Note que a
está ahora en el lado izquierdo, y b
está en el lado derecho, :D!
Para cualquiera que desee ordenar por fecha (formato del Reino Unido), utilicé lo siguiente:
//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]<b[i] ? 1 : 0; }); }
Podrías usar sortBy en guión bajo js.
http://underscorejs.org/#sortBy
Muestra:
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'));
Pude lograr la clasificación usando las siguientes líneas:
array.sort(function(a, b) { if (a.DueDate > b.DueDate) return 1; if (a.DueDate < b.DueDate) return -1; })
Acabo de tomar la transformada de Schwartzian que se muestra arriba y la hice como una función. Toma una array
, la function
de clasificación y un valor booleano como entrada:
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; }
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));
Esto debería funcionar cuando su fecha esté en este formato (dd/mm/yyyy).
sortByDate(arr) { arr.sort(function(a,b){ return Number(new Date(a.readableDate)) - Number(new Date(b.readableDate)); }); return arr; }
Luego llame a sortByDate(myArr);
Si, como yo, tiene una matriz con fechas formateadas como YYYY[-MM[-DD]]
donde le gustaría ordenar fechas más específicas antes que otras menos específicas, se me ocurrió esta práctica función:
function 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)) });
["12 Jan 2018" , "1 Dec 2018", "04 May 2018"].sort(function(a,b) { return new Date(a).getTime() - new Date(b).getTime() })
Gracias Ganesh Sanap. ordenar elementos por campo de fecha de antiguo a nuevo. úsalo
myArray = [{transport: "Air", load: "Vatican Vaticano", created: "01/31/2020"}, {transport: "Air", load: "Paris", created: "01/30/2020"}] myAarray.sort(function(a, b) { var c = new Date(a.created); var d = new Date(b.created); return cd; });
Yo personalmente uso el siguiente enfoque para ordenar las fechas.
let array = ["July 11, 1960", "February 1, 1974", "July 11, 1615", "October 18, 1851", "November 12, 1995"]; array.sort(function(date1, date2) { date1 = new Date(date1); date2 = new Date(date2); if (date1 > date2) return 1; if (date1 < date2) return -1; })
Gracias por esas respuestas brillantes en la parte superior. He pensado en una respuesta un poco complicada. Solo para aquellos que quieren comparar diferentes respuestas.
const data = [ '2-2018', '1-2018', '3-2018', '4-2018', '1-2019', '2-2019', '3-2019', '4-2019', '1-2020', '3-2020', '4-2020', '1-2021' ] let eachYearUniqueMonth = data.reduce((acc, elem) => { const uniqueDate = Number(elem.match(/(\d+)\-(\d+)/)[1]) const uniqueYear = Number(elem.match(/(\d+)\-(\d+)/)[2]) if (acc[uniqueYear] === undefined) { acc[uniqueYear] = [] } else{ if (acc[uniqueYear] && !acc[uniqueYear].includes(uniqueDate)) { acc[uniqueYear].push(uniqueDate) } } return acc; }, {}) let group = Object.keys(eachYearUniqueMonth).reduce((acc,uniqueYear)=>{ eachYearUniqueMonth[uniqueYear].forEach(uniqueMonth=>{ acc.push(`${uniqueYear}-${uniqueMonth}`) }) return acc; },[]) console.log(group); //["2018-1", "2018-3", "2018-4", "2019-2", "2019-3", "2019-4", "2020-3", "2020-4"]
Con las funciones de flecha de ES6, puede escribir solo una línea de código conciso (excluyendo la declaración de variables).
P.ej.:
var isDescending = true; //set to false for ascending console.log(["8/2/2020","8/1/2020","8/13/2020", "8/2/2020"].sort((a,b) => isDescending ? new Date(b).getTime() - new Date(a).getTime() : new Date(a).getTime() - new Date(b).getTime()));
Dado que el tiempo no existe con las fechas anteriores, el objeto Date considerará el siguiente tiempo predeterminado para la clasificación:
00:00:00
El código funcionará tanto para ordenación ascendente como descendente. Simplemente cambie el valor de la variable isDescending
según sea necesario.
Las cadenas con fechas son comparables en JavaScript (si son sintácticamente iguales), por ejemplo:
'2020-12-01' < '2020-12-02' == true
Esto significa que puede usar esta expresión en una función de clasificación personalizada:
var arr = [{id:1, date:'2020-12-01'}, {id:1, date:'2020-12-15'}, {id:1, date:'2020-12-12'}] function sortByDate(a, b) { if (a.date < b.date) { return 1; } if (a.date > b.date) { return -1; } return 0; } const sorted = arr.sort(sortByDate); console.log(sorted);
arr es una matriz de objetos y cada objeto tiene date_prop, que es una fecha. Puede ordenarlo en orden descendente/decreciente como este
arr = arr.sort(function (a, b) { var dateA = new Date(a.date_prop).getTime(); var dateB = new Date(b.date_prop).getTime(); return dateA < dateB ? 1 : -1; // ? -1 : 1 for ascending/increasing order });
Tengo una serie de objetos en los que la clave 'tiempo' contiene la fecha en formato ISO
Ejemplo: 2021-12-24T11:02:20.370705
arr.sort(function(a,b){return a.time > b.time ? 1 : a.time < b.time ? -1 : 0 });
¡Arriba funcionó para mí como un encanto!
Las respuestas anteriores son todas buenas 😊, aquí está mi implementación de la fecha de clasificación en la forma ES6, estoy usando Date.parse
(es un objeto de fecha global), esto convertirá la representación de cadena de Fecha en un número de milisegundos. En lugar de instanciar new Date
cada vez.
var array = ["2021-08-10T07:24:30.087+0000" , "2021-09-30T07:24:30.087+0000", "2021-10-13T07:24:30.087+0000"]; // sorting with latest date array.sort((a,b) => Date.parse(b) - Date.parse(a))