1099 votes

Comment trier un tableau d'objets par propriété de date ?

Disons que j'ai un tableau de quelques objets :

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

Comment puis-je trier ce tableau en fonction de l'élément date, en commençant par la date la plus proche de la date et de l'heure actuelles ? Gardez à l'esprit que le tableau peut contenir de nombreux objets, mais pour des raisons de simplicité, j'en ai utilisé 2.

Dois-je utiliser la fonction de tri et un comparateur personnalisé ?

0 votes

Si vous utilisez le constructeur Date, vérifiez d'abord ceci stackoverflow.com/questions/5619202/

2 votes

Le moyen le plus rapide est d'utiliser l'isomorphe tri-array qui fonctionne nativement dans le navigateur et dans le nœud, et qui prend en charge tous les types d'entrées, les champs calculés et les ordres de tri personnalisés.

2 votes

Il semble que cette question n'ait pas reçu de réponse. Aucune des réponses ci-dessous n'explique comment "commander à partir de la date la plus proche de la date actuelle".

2009voto

Phrogz Points 112337

Réponse la plus 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);
});

Réponse plus générique

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

Ou plus simplement :

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

Réponse générique et puissante

Définir une variable personnalisée non énumérable sortBy à l'aide d'un Transformation de Schwartz sur tous les tableaux :

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

Utilisez-le comme suit :

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

Si votre date n'est pas directement comparable, faites-en une date comparable, par exemple

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

Vous pouvez également l'utiliser pour trier sur plusieurs critères si vous renvoyez un tableau de valeurs :

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

Voir http://phrogz.net/JS/Array.prototype.sortBy.js pour plus de détails.

6 votes

Pourquoi ne pas le faire ? return b-a; dans la réponse simple ?

85 votes

Il n'est pas recommandé de créer de nouveaux objets Date dans la méthode de tri. Nous avons rencontré des problèmes de performance en production spécifiquement pour cette raison. Ne pas allouer de mémoire (et de GC) à l'intérieur d'une méthode de tri.

11 votes

La première syntaxe eg donne une erreur sur angular7 : Le côté gauche d'une opération arithmétique doit être du type "any", "number", "bigint" ou un type enum.

289voto

Gal Points 696

Les réponses de @Phrogz sont toutes deux excellentes, mais voici une réponse plus concise :

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

Utilisation de la fonction flèche

array.sort((a,b)=>a.getTime()-b.getTime());

se trouve ici : Trier la date en Javascript

44 votes

Faire le calcul directement a - b fonctionnerait également. Donc, array.sort((a, b) => a - b) (es6)

0 votes

a.getTime() - b.getTime() est considérablement plus rapide que a - b

0 votes

Concis, concis, si vous n'avez que des dates définies...

116voto

qw3n Points 2697

Après avoir corrigé le JSON, cela devrait fonctionner pour vous maintenant :

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

62voto

gabitzish Points 5056

Vos données doivent être corrigées :

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

Après avoir corrigé les données, vous pouvez utiliser ce morceau de code :

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

6 votes

9 votes

Pour ceux qui utilisent Typescript, j'ai pu trier par date en utilisant cette fonction, alors que les autres utilisant la soustraction de date ont échoué.

0 votes

Quelle est la différence ? Je vois différents types de guillemets et un espace, mais cela ne devrait pas avoir d'importance, ou est-ce que j'ai raté quelque chose ?

2voto

Thesane Points 154

Vous pouvez également utiliser cette lien . il fournit des fonctions de rappel qui peuvent être passées à des fonctions génériques. sort() fonction

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X