Trier un tableau d'objets par la valeur d'une propriété de type chaîne de caractères

J'ai un tableau d'objets JavaScript :

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

Comment puis-je les trier par la valeur de last_nom en JavaScript ?

Je connais la méthode sort(a,b), mais elle ne semble fonctionner que sur les chaînes de caractères et les nombres. Dois-je ajouter une méthode toString() à mes objets ?

Solution

Il est assez facile d'écrire votre propre fonction de comparaison :

function compare( a, b ) {
  if ( a.last_nom < b.last_nom ){
    return -1;
  }
  if ( a.last_nom > b.last_nom ){
    return 1;
  }
  return 0;
}

objs.sort( compare );

Ou en ligne (c/o Marco Demaio) :

objs.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0)); 
Commentaires (27)

Si vous avez des noms de famille en double, vous pouvez les trier par prénom...

obj.sort(function(a,b){
  if(a.last_nom< b.last_nom) return -1;
  if(a.last_nom >b.last_nom) return 1;
  if(a.first_nom< b.first_nom) return -1;
  if(a.first_nom >b.first_nom) return 1;
  return 0;
});
Commentaires (4)

Au lieu d'utiliser une fonction de comparaison personnalisée, vous pouvez également créer un type d'objet avec une méthode toString() personnalisée (qui est invoquée par la fonction de comparaison par défaut) :

function Person(firstName, lastName) {
    this.firtName = firstName;
    this.lastName = lastName;
}

Person.prototype.toString = function() {
    return this.lastName + ', ' + this.firstName;
}

var persons = [ new Person('Lazslo', 'Jamf'), ...]
persons.sort();
Commentaires (0)