Сортировка строк таблицы по ДВУМ переменным

Я пытаюсь динамически сортировать таблицу с помощью javascript/jQuery. Строки таблицы имеют 2 атрибута:

  1. крайний срок (временная метка unix)
  2. статус (1 или 2)

Таблицу нужно отсортировать по статусу (статус 1 сверху, статус 2 снизу), а затем по сроку выполнения (по возрастанию).

Например, правильный порядок примера строк будет следующим:

<table id = "todo_table">
  <tbody>
    <tr deadline = "1633333333" status = "1"></tr> 
    <tr deadline = "1644444444" status = "1"></tr>
    <tr deadline = "1611111111" status = "2"></tr>
    <tr deadline = "1622222222" status = "2"></tr>
  </tbody>
</table>

Однако из-за динамического добавления и удаления строк с помощью javascript (или из-за изменения сроков или статусов) я хочу иметь функцию, которая повторно сортирует таблицу после всех этих действий.

Мне удалось написать (скорее найти в Интернете) фрагмент кода, который сортирует таблицу по одному атрибуту:

var $table= $('#todo_table');
var rows = $table.find('tr').get();
rows.sort(function(a, b) {
  var keyA = $(a).attr('deadline');
  var keyB = $(b).attr('deadline');
  if (keyA < keyB) return -1;
  if (keyA > keyB) return 1;
  return 0;
});
$.each(rows, function(index, row) {
  console.info(row);
  $table.children('tbody').append(row);
});

Однако я не могу понять, как одновременно сортировать по второму атрибуту (сохраняя сортировку по другому атрибуту).

Вот мой фрагмент:

function sort_table(){

  var $table= $('#todo_table');
  var rows = $table.find('tr').get();
  rows.sort(function(a, b) {
    var keyA = $(a).attr('deadline');
    var keyB = $(b).attr('deadline');
    if (keyA < keyB) return -1;
    if (keyA > keyB) return 1;
    return 0;
  });
  $.each(rows, function(index, row) {
    $table.children('tbody').append(row);
  });
    
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<table id = "todo_table">
  <tbody>
    <tr deadline = "1622222222" status = "2"><td>Todo 4</td></tr>
    <tr deadline = "1611111111" status = "2"><td>Todo 3</td></tr>
    <tr deadline = "1644444444" status = "1"><td>Todo 2</td></tr>
    <tr deadline = "1633333333" status = "1"><td>Todo 1</td></tr>   
  </tbody>
</table>

<button onclick = "sort_table()">SORT</button>

Конечным результатом должно быть то, что строки в этом фрагменте отсортированы Задача 1 — Задача 2 — Задача 3 — Задача 4, но сейчас, поскольку сортировка выполняется только в «крайний срок», порядок такой: 3 — 4 — 1 — 2.

Любая помощь будет принята с благодарностью :-)

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

function sort_table(){
  var $table= $('#todo_table');
  var rows = $table.find('tr').get();
  rows.sort(function(a, b) {
var keyA = $(a).attr('status');
var keyB = $(b).attr('status');
if (keyA < keyB) return -1;
if (keyA > keyB) return 1;
var keyA = $(a).attr('deadline');
var keyB = $(b).attr('deadline');
if (keyA < keyB) return -1;
if (keyA > keyB) return 1;
return 0;
  });
  $.each(rows, function(index, row) {
$table.children('tbody').append(row);
  });
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<table id = "todo_table">
  <tbody>
    <tr deadline = "1622222222" status = "2"><td>Todo 4</td></tr>
    <tr deadline = "1611111111" status = "2"><td>Todo 3</td></tr>
    <tr deadline = "1644444444" status = "1"><td>Todo 2</td></tr>
    <tr deadline = "1633333333" status = "1"><td>Todo 1</td></tr>   
  </tbody>
</table>

<button onclick = "sort_table()">SORT</button>

Это решение дает тот же результат, что и ответ Гихана , только используя некоторые встроенные функции, такие как JQuery sort и empty, а также localeCompare современных браузеров для сортировки строк, поскольку оно в любом случае возвращает значение, ожидаемое sort:

referenceStr.localeCompare(compareString) возвращается отрицательное число, если referenceStr встречается перед compareString; положительный, если referenceStr происходит после compareString; 0, если они эквивалентны.

Пока это работает, я бы рекомендовал использовать атрибуты data-* (например, data-deadline вместо deadline), чтобы убедиться, что вы не конфликтуете ни с одним стандартным HTML-атрибутом.

function sort_table() {
  const tableBody = $("#todo_table > tbody");
  
  // Find & sort table rows
  const rows = tableBody
    .children()
    .sort((rowA, rowB) => {
      const a = toSortAttributes(rowA);
      const b = toSortAttributes(rowB);

      const deadlineOrder = a.deadline.localeCompare(b.deadline);
      const statusOrder = a.status.localeCompare(b.status);     

      if (statusOrder === 0) {
        return deadlineOrder;
      } else {
        return statusOrder
      }
    });

  // Remove old rows, replace with sorted ones
  tableBody
    .empty()
    .append(rows);
}

function toSortAttributes(row) {
  const deadline = $(row).attr("deadline");
  const status = $(row).attr("status");
  
  return { deadline, status };
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<table id = "todo_table">
  <tbody>
    <tr deadline = "1622222222" status = "2"><td>Todo 4</td></tr>
    <tr deadline = "1611111111" status = "2"><td>Todo 3</td></tr>
    <tr deadline = "1644444444" status = "1"><td>Todo 2</td></tr>
    <tr deadline = "1633333333" status = "1"><td>Todo 1</td></tr>   
  </tbody>
</table>

<button onclick = "sort_table()">SORT</button>

Другие вопросы по теме