• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

562
Views
¿Cómo ordenar una matriz de objetos por propiedad de fecha?

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?

over 3 years ago · Santiago Trujillo
21 answers
Answer question

0

Respuesta más simple

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

Respuesta más genérica

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

Respuesta genérica y poderosa

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.

over 3 years ago · Santiago Trujillo Report

0

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; });
over 3 years ago · Santiago Trujillo Report

0

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);​
over 3 years ago · Santiago Trujillo Report

0

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

over 3 years ago · Santiago Trujillo Report

0

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!

over 3 years ago · Santiago Trujillo Report

0

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; }); }
over 3 years ago · Santiago Trujillo Report

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'));
over 3 years ago · Santiago Trujillo Report

0

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; })
over 3 years ago · Santiago Trujillo Report

0

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

over 3 years ago · Santiago Trujillo Report

0

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

over 3 years ago · Santiago Trujillo Report

0

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) }
over 3 years ago · Santiago Trujillo Report

0

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)) });
over 3 years ago · Santiago Trujillo Report

0

["12 Jan 2018" , "1 Dec 2018", "04 May 2018"].sort(function(a,b) { return new Date(a).getTime() - new Date(b).getTime() })
over 3 years ago · Santiago Trujillo Report

0

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; });
over 3 years ago · Santiago Trujillo Report

0

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; })
over 3 years ago · Santiago Trujillo Report

0

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"]
over 3 years ago · Santiago Trujillo Report

0

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.

over 3 years ago · Santiago Trujillo Report

0

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

over 3 years ago · Santiago Trujillo Report

0

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 });
over 3 years ago · Santiago Trujillo Report

0

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!

over 3 years ago · Santiago Trujillo Report

0

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))
over 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error