web-dev-qa-db-fra.com

Fonction de comparateur personnalisé de tri javascript - tri d'un tableau trié

J'ai un tableau d'objets de la forme suivante:

arr[0] = { 'item1' : 1234, 'item2' : 'a string' };

Je le trie d'abord par 'item1' qui est simple. Maintenant, je veux trier arr (qui est trié par 'item1') mais cette fois par 'item2' mais uniquement pour les éléments où 'item1' est identique. Le tableau final ressemblerait à ceci:

arr = [
  { 'item1' : 1234, 'item2' : 'Apple' },
  { 'item1' : 1234, 'item2' : 'banana' },
  { 'item1' : 1234, 'item2' : 'custard' },
  { 'item1' : 2156, 'item2' : 'melon' },
  { 'item1' : 4345, 'item2' : 'asparagus' } 
];

J'ai essayé d'écrire une fonction de tri pour le second cas comme suit:

arr.sort(function(a,b){
  if(a.item1 === b.item1){
    return a.item2 > b.item2 ? 1 : a.item2 < b.item2 : -1 : 0;
  }
});

Je pourrais combiner les deux tris en une seule fonction pour obtenir le tableau final trié, mais il y aura des cas où je devrai trier uniquement 'item1' ou simplement 'item2'

20
fenderplayer

Vous pouvez avoir quatre fonctions de comparaison différentes - une triant par article1, une par article2, une par article1 puis article2 et une par article2 puis article1.

Par exemple.:

arr.sort(function(a,b){
  if(a.item1 == b.item1){
    return a.item2 > b.item2 ? 1 : a.item2 < b.item2 ? -1 : 0;
  }

  return a.item1 > b.item1 ? 1 : -1;
});
28
Petar Ivanov

Vous pouvez également l’étendre à votre guise, en remplaçant le 0 par une autre chaîne de comparaison. Basculez <et> ou -1 et 1 pour l'ordre inverse.

someArray.sort(function(a,b) {
  return a.item1 > b.item1 ? 1 : a.item1 < b.item1 ? -1 : a.item2 > b.item2 ? 1 : a.item2 < b.item2 ? -1 : 0;
});
0
Jonas Ostergaard