Как отсортировать массив по нескольким значениям?

Ссылка скопирована
1 ответ

Добрый день, подскажите пожалуйста, как сделать сортировку по нескольких значений?
Первое работает: arrray.sort((a, b) => a.status_sitter - b.status_sitter)
А внутри их ещё есть потом по дате (status_date)
Примерно так выглядит:

if (MatchingFind.status_sitter === 'yes') {    Babysitters[a].status_sitter = 1;    Babysitters[a].status_date = MatchingFind.date; }  if (MatchingFind.status_sitter === 'no') {    Babysitters[a].status_sitter = 3;    Babysitters[a].status_date = MatchingFind.date; //2023-10-26 11:32:44 format date }

if (MatchingFind.status_sitter === 'yes') { Babysitters[a].status_sitter = 1; Babysitters[a].status_date = MatchingFind.date; } if (MatchingFind.status_sitter === 'no') { Babysitters[a].status_sitter = 3; Babysitters[a].status_date = MatchingFind.date; //2023-10-26 11:32:44 format date }

Вот хочу 2 сорт был по дате status_date . Первый прекрасно работает. Может подсказать, как сделать сначала по статусу, а потом по дате внутри статуса??

Дополнительно:

// Сначала, как обычно сортируем по статусу if (a.status > b.status) return 1; if (a.status < b.status) return -1; // Потом, если статусы равны, - по дате if (a.date > b.date) return 1; if (a.date < b.date) return -1; return 0;

// Сначала, как обычно сортируем по статусу if (a.status > b.status) return 1; if (a.status < b.status) return -1; // Потом, если статусы равны, - по дате if (a.date > b.date) return 1; if (a.date < b.date) return -1; return 0;

В итоге может выглядеть так:

arr.sort((a,b) => {   if (a.status === b.status) {     if (a.date === b.date) return 0;     return a.date > b.date ? 1 : -1;   }   return a.status > b.status ? 1 : -1; })

arr.sort((a,b) => { if (a.status === b.status) { if (a.date === b.date) return 0; return a.date > b.date ? 1 : -1; } return a.status > b.status ? 1 : -1; })

  • первый вариант удобнее для потенциальных изменений - он "линейный", легко добавлять/выкидывать сравнения.
  • Я использовал 2 вариант, так как у меня происходит после .sort(*).map()
    Спасибо большое
  • aliaksandr-go, варианты одинаковы. Различие только в написании, кому как удобнее читать.
    arr.sort((a,b) => {   if (a.status > b.status) return 1;   if (a.status < b.status) return -1;   if (a.date > b.date) return 1;   if (a.date < b.date) return -1;   return 0; })

    arr.sort((a,b) => { if (a.status > b.status) return 1; if (a.status < b.status) return -1; if (a.date > b.date) return 1; if (a.date < b.date) return -1; return 0; })

Ответы:

Если даты записаны строками, то так:

array.sort(   (a, b) => (     a.status_sitter != b.status_sitter        ? a.status_sitter - b.status_sitter       : a.status_date.localeCompare(b.status_date)   ), );

array.sort( (a, b) => ( a.status_sitter != b.status_sitter ? a.status_sitter - b.status_sitter : a.status_date.localeCompare(b.status_date) ), );

  • Подскажите пожалуйста, что за метод localeCompare?
    Да дата строка
  • aliaksandr-go, https://developer.mozilla.org/en-US/docs/Web/JavaS...
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

Для сортировки массива по нескольким значениям в PHP можно воспользоваться функцией usort. Эта функция позволяет задать пользовательскую функцию сравнения для определения порядка элементов в массиве.

Пример сортировки массива по двум значениям (например, сначала по возрастанию значения 'name', затем по убыванию значения 'age'):

$users = [
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30],
    ['name' => 'Alice', 'age' => 20],
    ['name' => 'Bob', 'age' => 25],
];
 
usort($users, function($a, $b) {
    if ($a['name'] == $b['name']) {
        return $b['age'] - $a['age']; // Сортировка по убыванию возраста
    }
    return $a['name'] < $b['name'] ? -1 : 1; // Сортировка по возрастанию имени
});
 
print_r($users);

$users = [ ['name' => 'Alice', 'age' => 25], ['name' => 'Bob', 'age' => 30], ['name' => 'Alice', 'age' => 20], ['name' => 'Bob', 'age' => 25], ]; usort($users, function($a, $b) { if ($a['name'] == $b['name']) { return $b['age'] - $a['age']; // Сортировка по убыванию возраста } return $a['name'] < $b['name'] ? -1 : 1; // Сортировка по возрастанию имени }); print_r($users);

В данном примере мы сначала сравниваем значения 'name', если они равны, то сравниваем значения 'age' в обратном порядке. Если 'name' не равны, то сортируем по возрастанию имени.

Таким образом, используя функцию usort и определяя пользовательскую функцию сравнения, можно легко отсортировать массив по нескольким значениям в PHP.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно