Преобразование строки во время и его сортировка

Есть простое приложение сделанное в реакте с помощью функционального компонента. Само приложение представляет из себя таблицу, которая получает данные через json файл. Функционал приложения предусматривает возможность сортировки колонок таблицы по возрастанию/по убыванию.

Функция сортировки выглядит следующим образом

const [directionSort, setDirectionSort] = useState(true);

const sortData = (field) => {
const copyData = tableItems.concat();

let sortData;

if (directionSort) {
  sortData = copyData.sort(
    (a, b) => { return a[field] > b[field] ? 1 : -1 }
  );
} else {
  sortData = copyData.sort(
    (a, b) => { return a[field] < b[field] ? 1 : -1 }
  );
}


setTableItems(sortData)
setDirectionSort(!directionSort)
}

Этот код отрабатывает отлично на всех колонках, кроме одной. Есть колонка, в которой указано время, в формате "1m32s" и эти данные приходят из json в строковом формате, именно в таком виде.

"result": "1m 32s"

Соответственно, сортировка этой колонки при таком формате отрабатывает некорректно, т.к. сортировка по возрастанию даёт такой вывод:

08s

1m 15s

32s

Вопрос, как можно обработать получаемые данные, что бы выводились они в таком же формате, но сортировались корректно ? Допускается также изменить формат данных в json файле


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

Автор решения: S.H.

Как я понимаю, проблема связана вот с чем: во всех колонках происходит сортировка в лексикографическом порядке, то есть "по алфавиту". А в той, колонке, где записано время - такая сортировка не подходит.

Я бы предложил такое решение: у вас в коде есть участок кода, который, собственно, принимает решение "что а больше б": (a, b) => { return a[field] > b[field] ? 1 : -1 }. Нужно сделать исключение для колонки со временем, и обработать её так: преобразовать время в что то типа int (минуты * 60 + секунды) и принимать решение что "а больше б" уже на основе сравнения этих int'ов.

Там есть некотрая возня, связанная с форматом колонки со временем, но она преодолима.

Если такого объяснения недостаточно, дайте знать в комментариях: я напишу корявый код обработки строк на js

→ Ссылка