45 votes

Comment trier/ordonner une liste par date en dart/flutter ?

J'ai la liste suivante que j'essaie de réorganiser/ classer par DateTime.

import 'package:intl/intl.dart'; 
//n'oubliez pas d'ajouter sous les dépendances pubspec.yml "intl: ^0.15.8"

Liste de produits = [];

//ajout dans la nouvelle liste à partir de la liste API brute
for (final article in produitsBruts){

   var dateAnalysee = DateTime.parse.(article['dateExpiration']);
   tmpArray = {
     'id': article['id'],
     'nom': article['nom'],
     'prix': article['prix'],
     'expiration': dateAnalysee
   }
   produits.add(tmpArray);
  }
}

Liste de produits = [

 {id: 1242, nom: lait, prix: $5, expiration: 2019-11-25 00:00:00:000},
 {id: 1242, nom: œuf, prix: $2, expiration: 2019-11-22 00:00:00:000},
 {id: 1243, nom: pain, prix: $3, expiration: 2019-11-22 00:00:00:000},
 {id: 1244, nom: beurre, prix: $7, expiration: 2019-11-24 00:00:00:000},
 {id: 1247, nom: beurre, prix: $7, expiration: 2019-11-23 00:00:00:000},

]

Je souhaite réorganiser la liste de sorte que la date d'expiration la plus éloignée apparaisse en premier :

 25-11-2019
 24-11-2019
 23-11-2019
 22-11-2019
 22-11-2019

Ce que j'ai essayé (mis à jour) -> RÉSOLU en changeant a.expiry en a['expiration'] :

  produits.sort((a,b) {
    var adate = a['expiration'] //avant -> var adate = a.expiry;
     var bdate = b['expiration'] //var bdate = b.expiry;
     return -adate.compareTo(bdate);
  });

avec la fonction de tri je reçois cette erreur (RÉSOLU par la correction ci-dessus) :

Unhandled Exception: NoSuchMethodError: Class 
'_InternalLinkedHashMap' n'a pas de getter d'instance 'expiration'.

53voto

MichaelM Points 1341

Dans votre exemple ci-dessus, expiry est une String, et non un objet DateTime. Vous avez quelques options ici, selon ce que vous voulez accomplir.

La solution la plus simple serait d'utiliser la méthode compareTo intégrée à String, qui permet de trier les Strings. Ces horodatages sont déjà dans un format triable, donc cela fonctionnerait :

products.sort((a,b) {
    return a.compareTo(b);
 });

Ou de manière plus concise :

products.sort((a,b) => a.compareTo(b));

C'est assez basique. Comme l'a mentionné pskink dans le commentaire, en construisant là-dessus, vous pourriez convertir les Strings en objets DateTime réels.

DateTime expiryAsDateTime = DateTime.parse(expiry);

DateTime a également une méthode intégrée compareTo, donc le snippet de code ci-dessus fonctionnerait avec des DateTimes ainsi qu'avec des Strings.

Si vous voulez inverser l'ordre, il suffit d'échanger a et b.

14voto

Mikethetechy Points 339

J'ai corrigé en changeant changing a.expiry into a['expiry'] et b.expiry into b['expiry']

products.sort((a,b) {
 var adate = a['expiry'] //avant -> var adate = a.expiry;
 var bdate = b['expiry'] //avant -> var bdate = b.expiry;
 return adate.compareTo(bdate); //pour obtenir l'ordre inverse, il suffit de permuter `adate & bdate`
});

5voto

user9139407 Points 187

convertir en DateTime

import 'package:intl/intl.dart';

void main() {
  List products = [
    "2019-11-25 00:00:00.000",
    "2019-11-22 00:00:00.000",
    "2019-11-22 00:00:00.000",
    "2019-11-24 00:00:00.000",
    "2019-11-23 00:00:00.000"
  ];
  List newProducts = [];
  DateFormat format = DateFormat("yyyy-MM-dd");

  for (int i = 0; i < 5; i++) {
    newProducts.add(format.parse(products[i]));
  }
  newProducts.sort((a,b) => a.compareTo(b));

  for (int i = 0; i < 5; i++) {
    print(newProducts[i]);
  }
}

sans convertir en DateTime

import 'package:intl/intl.dart';

void main() {
  List products = [
    "2019-11-25 00:00:00.000",
    "2019-11-22 00:00:00.000",
    "2019-11-22 00:00:00.000",
    "2019-11-24 00:00:00.000",
    "2019-11-23 00:00:00.000"
  ];

  products.sort((a,b) => a.compareTo(b));

  for (int i = 0; i < 5; i++) {
    print(products[i]);
  }
}

1voto

MosesAyo Points 46

Si vous souhaitez trier les objets par un nom de propriété sans avoir à utiliser DateTime en supposant que la date et l'heure sont des chaînes, faites ceci :

products.sort((a, b)=> a['expiry'].compareTo(b['expiry']));

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