it-swarm.com.ru

Пользовательская функция сравнения Javascript - сортировка отсортированного массива

У меня есть массив объектов следующей формы:

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

Сначала я сортирую по 'item1', что довольно просто. Теперь я хочу снова отсортировать arr (который отсортирован по 'item1'), но на этот раз по 'item2', но только для элементов, где 'item1' одинаков. Конечный массив будет выглядеть так:

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

Я попытался написать функцию сортировки для второго случая так:

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

Я мог бы объединить две сортировки в одной функции, чтобы получить окончательный отсортированный массив, но будут случаи, когда мне придется сортировать по 'item1' или просто 'item2'

20
fenderplayer

У вас может быть четыре различные функции сравнения - одна сортировка по элементу 1, одна по элементу 2, одна по элементу 1, затем элементу 2 и одна по элементу 2, затем элементу1.

Например.:

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

Или как простой oneliner для сортировки с первым и вторым приоритетом, вы можете расширить его по своему желанию, просто заменив 0 на другую цепочку сравнения. Переключите <и> или -1 и 1 для обратного порядка.

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