web-dev-qa-db-fra.com

Trier un tableau d'objets avec date date par date

Donnez le tableau d'objets suivant, je dois les trier par ordre croissant de date.

var myArray = [
  {
    name: "Joe Blow",
    date: "Mon Oct 31 2016 00:00:00 GMT-0700 (PDT)"
  },
  {
    name: "Sam Snead",
    date: "Sun Oct 30 2016 00:00:00 GMT-0700 (PDT)"
  },
  {
    name: "John Smith",
    date: "Sat Oct 29 2016 00:00:00 GMT-0700 (PDT)"  
  }
];

de sorte que dans cet exemple, le résultat final serait John Smith, Sam Snead et Joe Blow.

J'essaie d'utiliser _. SortBy () de lodash, mais je ne parviens pas à faire un tri, peu importe comment j'essaie de l'utiliser:

_.sortBy(myArray, function(dateObj) {
  return dateObj.date;
});

ou

_.sortBy(myArray, 'date');

Que dois-je changer pour que mon tableau soit trié correctement? J'ai aussi Moment.js, je peux donc l'utiliser pour formater la chaîne de date si nécessaire. J'ai essayé de convertir la propriété date en utilisant .unix (), mais cela ne faisait aucune différence.

Merci.

19
wonder95

Vous n'avez pas vraiment besoin de lodash. Il suffit d'utiliser JavaScript Array.prototype.sort méthode.

Vous devez créer Date objets à partir de vos chaînes de date avant de pouvoir les comparer.

var myArray = [{
  name: "Joe Blow",
  date: "Mon Oct 31 2016 00:00:00 GMT-0700 (PDT)"
}, {
  name: "Sam Snead",
  date: "Sun Oct 30 2016 00:00:00 GMT-0700 (PDT)"
}, {
  name: "John Smith",
  date: "Sat Oct 29 2016 00:00:00 GMT-0700 (PDT)"
}];

myArray.sort(function compare(a, b) {
  var dateA = new Date(a.date);
  var dateB = new Date(b.date);
  return dateA - dateB;
});

console.log(myArray);
42
Punit

Vos valeurs de date sont des chaînes, vous devez donc utiliser le constructeur new Date() pour les changer en objets javascript date. De cette façon, vous pouvez les trier (en utilisant _.sortBy).

var myArray = [
  {
    name: "Joe Blow",
    date: "Mon Oct 31 2016 00:00:00 GMT-0700 (PDT)"
  },
  {
    name: "Sam Snead",
    date: "Sun Oct 30 2016 00:00:00 GMT-0700 (PDT)"
  },
  {
    name: "John Smith",
    date: "Sat Oct 29 2016 00:00:00 GMT-0700 (PDT)"  
  }
];

myArray = _.sortBy(myArray, function(dateObj) {
  return new Date(dateObj.date);
});

console.log(myArray)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>
7
Dekel

Voici une solution utilisant Javascript standard en convertissant les deux valeurs en objet date et en comparant leur valeur.

myArray.sort((d1, d2) => new Date(d1.date).getTime() - new Date(d2.date).getTime());

Un extrait complet:

var myArray = [
  {
    name: "Joe Blow",
    date: "Mon Oct 31 2016 00:00:00 GMT-0700 (PDT)"
  },
  {
    name: "Sam Snead",
    date: "Sun Oct 30 2016 00:00:00 GMT-0700 (PDT)"
  },
  {
    name: "John Smith",
    date: "Sat Oct 29 2016 00:00:00 GMT-0700 (PDT)"  
  }
];

myArray.sort((d1, d2) => new Date(d1.date).getTime() - new Date(d2.date).getTime());

console.log(myArray);
4
Robby Cornelissen

écrivez juste _.sortBy({yourCollection}, {the field name});

lodash comprendra automatiquement qu'il s'agit d'une date et que tout fonctionnera comme par magie!

Impressionnant!

1
oded