Возможно, вы столкнулись с проблемой, когда new Date(...)
не обрабатывает строки этого формата, поскольку это не стандартный формат. new Date("02-04-2020")
интерпретирует его как 4 февраля 2020 года, а new Date("16-04-2020")
выдает ошибку. Кажется, здесь используются американские форматы дат, где мы используем их задом наперед.
Если бы ваши даты были в формате yyyy-mm-dd
, то new Date(...)
работало бы правильно, поэтому, если вы сможете изменить это, это будет самый плавный маршрут. Если вы не можете изменить формат, попробуйте изменить сортировку следующим образом:
const sorted_array = data
.map(addSortableColumn)
.sort(bySortColumn)
.map(removeSortableColumn);
function addSortableColumn(item) {
const [day, month, year] = item.date.split('-');
return { ...item, _sortBy: year + month + day };
}
function bySortColumn(a, b) {
return a._sortBy.localeCompare(b._sortBy);
}
function removeSortableColumn(item) {
const { _sortBy, ...otherProps } = item;
return otherProps;
}
(если вам не нужно удалять столбец сортировки, вы можете пропустить этот последний шаг)
Обновление
Если вам нужно сохранить прототипы объектов, было правильно указано, что синтаксис распространения разрушает это. Еще один подход, который мне действительно нравится, даже лучше - хранить столбцы сортировки на отдельной карте. Причина, по которой он даже сохраняется, состоит в том, чтобы избежать необходимости многократного вычисления ключей сортировки.
const sortKeys = new Map();
const sorted_array = data.slice().sort(byDDMMYYYY);
function byDDMMYYYY(a, b) {
return getSortKey(a).localeCompare(getSortKey(b));
}
function getSortKey(item) {
let key = sortKeys.get(item);
if (!key) {
const [day, month, year] = item.date.split('-');
key = year + month + day;
sortKeys.set(item, key);
}
return key;
}