Сортировка массива по нескольким полям на JavaScript

Есть массив:

let arr = [ 
    {'time':'10:00','status':'тест1', 'dday': 'субб'},
    {'time':'09:00','status':'тест1', 'dday': 'воскр'},
    {'time':'12:00','status':'тест1', 'dday': 'субб'},
    {'time':'12:30','status':'тест1', 'dday': 'воскр'},
    {'time':'09:00','status':'тест1', 'dday': 'субб'},
    {'time':'13:00','status':'тест1', 'dday': 'воскр'},    
];

Как его отсортировать, чтобы вначале шла суббота, потом воскресенье, ну и чтобы время было во возрастанию?


Ответы (1 шт):

Автор решения: Alexander Chernin

let arr = [ 
    {'time':'10:00','status':'тест1', 'dday': 'субб'},
    {'time':'09:00','status':'тест1', 'dday': 'воскр'},
    {'time':'12:00','status':'тест1', 'dday': 'субб'},
    {'time':'12:30','status':'тест1', 'dday': 'воскр'},
    {'time':'09:00','status':'тест1', 'dday': 'субб'},
    {'time':'13:00','status':'тест1', 'dday': 'воскр'},    
];

// Функция создания даты из строки формата "hh:mm"
const toDate = (value) => {
    const d = value.split(':');
    return new Date(0, 0, 0, d[0], d[1]);
};
// Функция сравнения дат
const compareDate = (d1, d2) => d1 - d2;

// Дни недели
const wdays = ['понед', 'втор', 'сред', 'чт', 'пятн', 'субб', 'воскр'];

// Результат
let result = [];

// Сортировка
wdays.forEach( day => {
    // Получаем все значения для текущего дня недели и сортируем их по времени
    const a = arr.filter( a => a['dday'] === day )
                 .sort( (a, b) => compareDate(toDate(a['time']), toDate(b['time'])));
    
    // Полученный отсортированный массив
    if (Array.isArray(a)) {
        // Добавляем к результирующему  
        result = result.concat(a);
    }
});

console.log(result);

→ Ссылка