Сортировать по двум свойствам условно [дубликаты]

1

Рассмотрим следующий сценарий, где мне нужно отсортировать список студентов по имени и баллу.

[
 {
  name: 'Max',
  score: 94
 },
 {
  name: 'Jerome',
  score: 86
 },
 {
  name: 'Susan',
  score: 86
 },
 {
  name: 'Abel',
  score: 86
 },
 {
  name: 'Kevin',
  score: 86
 }
]

Я хочу отсортировать список учеником, который набрал наивысший результат, но если у двух или более учеников одинаковый балл, то я хочу сортировать этих учеников по алфавиту. Для вышеуказанного случая результат должен быть следующим:

[
 {
  name: 'Max',
  score: 94
 },
 {
  name: 'Abel',
  score: 86
 },
 {
  name: 'Jerome',
  score: 86
 },
 {
  name: 'Kevin',
  score: 86
 },
 {
  name: 'Susan',
  score: 86
 }
]

Как я могу это достичь? Есть ли какая-нибудь функция lodash, которую я могу использовать, или это возможно с использованием чистого JavaScript?

Теги:
arrays
lodash
underscore.js

4 ответа

5

Никакой библиотеки не нужно, просто сравните score, и если это произойдет до 0, сравните имена:

const arr=[{name:'Max',score:94},{name:'Jerome',score:86},{name:'Susan',score:86},{name:'Abel',score:86},{name:'Kevin',score:86}]

console.log(
  arr.sort((a, b) => b.score - a.score || a.name.localeCompare(b.name))
);
  • 0
    Это прекрасно работает. Спасибо!
1

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

let obj = [
 {
  name: 'Max',
  score: 94
 },
 {
  name: 'Jerome',
  score: 86
 },
 {
  name: 'Susan',
  score: 86
 },
 {
  name: 'Abel',
  score: 86
 },
 {
  name: 'Kevin',
  score: 86
 }
];

obj.sort((a,b) => {
  if(b.score - a.score === 0){
    if(a.name < b.name) return -1;
    if(a.name > b.name) return 1;
    return 0;
  }
  else{
     return b.score - a.score;
  }
});

console.log(obj);
1

Вы можете сортировать по _.sortBy и взять список propertis и другой для заказа.

var array = [{ name: 'Max', score: 94 }, { name: 'Jerome', score: 86 }, { name: 'Susan', score: 86 }, { name: 'Abel', score: 86 }, { name: 'Kevin', score: 86 }];

console.log(_.sortBy(array, ['score', 'name'], ['desc', 'asc']))
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
1

Попробуйте следующее:

var arr = [
 {
  name: 'Max',
  score: 94
 },
 {
  name: 'Jerome',
  score: 86
 },
 {
  name: 'Susan',
  score: 86
 },
 {
  name: 'Abel',
  score: 86
 },
 {
  name: 'Kevin',
  score: 86
 }
];
arr.sort((a,b)=>{
 return (b.score - a.score) || a.name.localeCompare(b.name);
});
console.log(arr);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню