11486 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

Je suis novice en js et je sollicite votre aide.

Je souhaite trier un tableau de dates qui sont au format dd/mm/yyyy.

J'ai déjà mis en place la fonction suivante (que j'ai récupérer qlq part sur le web):

function sortByProperties(array, properties, order) {
	var propArray = properties.split('|');
	return array.sort(function (a, b) {
		var tmpA = '';
		var tmpB = '';
		for (i = 0; i < propArray.length; i++) {
			tmpA += String.fromCharCode(10) + a[propArray[i]];
			tmpB += String.fromCharCode(10) + b[propArray[i]];
		}
		if (tmpA === tmpB) {
			return 0
		}
		return order == 'croissant' ? (tmpA.toLowerCase() < tmpB.toLowerCase() ? -1 : 1) : (tmpA.toLowerCase() > tmpB.toLowerCase() ? -1 : 1);
	});
}


Mais celle-ci tri sur le jour et non sur la totalité de la date. Je pense qu'il considère que c'est du texte.

Merci d'avance pour votre aide.
Re,

Alors je pense avoir trouvé la solution avec le code suivant si cela peut aider qlq un :


function sortByProperties(array, properties, order) {
	var propArray = properties.split('|');
	return array.sort(function (a, b) {
		var tmpA = '';
		var tmpB = '';
		for (i = 0; i < propArray.length; i++) {
			tmpA += new Date(a[propArray[i]]);
			tmpB += new Date(b[propArray[i]]);
		}		
		if (tmpA >= tmpB) {
			return 0
		}
		return order == 'croissant' ? (tmpA.toLowerCase() < tmpB.toLowerCase() ? -1 : 1) : (tmpA.toLowerCase() > tmpB.toLowerCase() ? -1 : 1);
	});
}


Si qlq un peut y jeter un coup d'oeil et me dire ce qu'il en pense. Et si cela peut aider qlq un alors tant mieux.
Salut

Il faut convertir la date en millisecondes pour faire le tri,.

Un exemple avec moment.js : https://momentjs.com/

<script defer src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/locale/fr.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.20/moment-timezone-with-data.min.js"></script>


moment.locale('fr');

// Compare dates to sort
function compareMoment(a, b) {
    if (a.valueOf() < b.valueOf()) return -1;
    if (a.valueOf() > b.valueOf()) return 1;
    return 0;
}

let dates = [ moment('2013-08-30 01:54'), moment('2013-08-17 11:54'), moment('2013-10-03 04:00'), moment('2013-08-30 12:54'), moment('2013-08-29 07:06') ];

dates.sort(compareMoment);

for (const date of dates){
    console.log(`date = ${ date.format() }`);
}

/*
date = 2013-08-17T11:54:00+02:00
date = 2013-08-29T07:06:00+02:00
date = 2013-08-30T01:54:00+02:00
date = 2013-08-30T12:54:00+02:00
date = 2013-10-03T04:00:00+02:00
*/
Merci d'avoir contribué.

Alors je poste la solution que j'ai mise en oeuvre et qui fonctionne où je retraite le format de date pour le mettre au format YYYY/MM/DD. Du coup il les compare par ordre alphabétique et cela évite le souci avec les dates au format US.

		if(properties=="dateemission"){
			for (i = 0; i < propArray.length; i++) {
			
				tmpA += String.fromCharCode(10) + a[propArray[i]];
				tmpB += String.fromCharCode(10) + b[propArray[i]];

				var resA = tmpA.split("/");
				var resB = tmpB.split("/");

				tmpA=resA[2]+"/"+resA[1]+"/"+resA[0];
				tmpB=resB[2]+"/"+resB[1]+"/"+resB[0];		
			}
		} 

		if (tmpA === tmpB) {
			return 0


Du coup si cela peut servir pour d'autres ne vous gênez pas. Smiley lol
Modifié par FChucky (05 Sep 2018 - 10:07)
Meilleure solution