Множественная сортировка объекта Array по {понравился: true}, расстоянию и затем по avg_rating - PullRequest
1 голос
/ 05 июля 2019

У меня есть массив Object следующим образом:

arr = [ {distance:4, avg_rating: 5}, 
        {distance: 6, avg_rating: 4}, 
        {distance: 7, avg_rating: 2, liked: true}, 
        {distance: 6, avg_rating: 4 , liked: true}, 
        {distance: 6, avg_rating: 3 , liked: true},
        {distance: 4, avg_rating: 3}]

Я хочу получить сначала {likes: true}, а затем он будет отсортирован по расстоянию в порядке возрастания, и если расстояние будет таким же, то будетбыть отсортированы в соответствии с avg_rating.

Я использовал метод сортировки JavaScript, который не работает.

arr.sort(function(a, b){                                     
      if (b.liked)  return  1;
      if(!b.liked) return -1;
      if (a.distance < b.distance) return 1;
      if (a.distance > b.distance) return -1;
      if (a.avg_rating < b.avg_rating) return -1;
      if (a.avg_rating > b.avg_rating) return 1;
 })

Я ожидаю, что результат будет

arr = [{distance: 6, avg_rating: 4 , liked: true},
       {distance: 6, avg_rating: 3 , liked: true}
       {distance: 7, avg_rating: 2, liked: true},
       {distance: 4, avg_rating: 5},
       {distance: 4, avg_rating: 3},
       {distance: 6, avg_rating: 4}]

Так что, сначала все {понравилось: true} сверху и отсортированы по расстоянию в порядке возрастания (то есть все рядом находятсяначало массива), а затем, если расстояние одинаковое, сортируйте по avg_rating в порядке убывания (т.е. все те же значения расстояния снова сортируются по avg_rating)

1 Ответ

1 голос
/ 05 июля 2019

Вы можете связать все условия и получить требуемый заказ, получив дельту каждого элемента.

Для первой пары возьмите логическое НЕ !, чтобы получить логическое значение для вычитания.

Остальные взяты в порядке сортировки, a - b (asc) и b - a (desc).

var array = [{ distance: 4, avg_rating: 5 }, { distance: 6, avg_rating: 4 }, { distance: 7, avg_rating: 2, liked: true }, { distance: 6, avg_rating: 4, liked: true }, { distance: 6, avg_rating: 3, liked: true }, { distance: 4, avg_rating: 3 }];

array.sort((a, b) =>
    !a.liked - !b.liked ||
     a.distance - b.distance ||
     b.avg_rating - a.avg_rating
);

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...