Как сортировать массив объектов, где ключи-даты
Я искал этот вопрос, и, похоже, не существует ответа. Рассмотрим следующее:
[
{ 'August 17th 2016': [75] }, // 75 is the length of the array which contains up to 75 objects ...
{ 'August 1st 2016': [5] },
{ 'August 28th 2016': [5] },
...
]
каков наилучший способ сортировки объектов в этом массиве по дате и по-прежнему сохранять "английское" представление их ключа?
Примечание: ключ используется в качестве метки диаграммы.
куда ни глянь array.sort
используется, но это на ключе объекта say created_at
.
результат должен быть:
[
{ 'August 1st 2016': [5] },
{ 'August 17th 2016': [75] }
{ 'August 28th 2016': [5] },
...
]
Я не уверен, как действовать, поэтому мне нечего показать.
2 ответов
это может быть достигнуто с помощью date.parse
на ключевой объект. Я взял первый ключ объекта, поскольку в каждой записи массива есть только 1. Хитрость в том, что date.parse
не работает на " 12th "или" 1st", поэтому мы должны временно заменить" th "или" st " на ,
. Сюда,date.parse
работает со строкой.
var dates = [{
'August 17th 2016': [75]
}, {
'August 1st 2016': [5]
}, {
'August 28th 2016': [5]
}]
const replaceOrdinals = o => {
return Object.keys(o)[0].replace(/\w{2}( \d+$)/, ',');
}
dates = dates.sort((a, b) => {
return Date.parse(replaceOrdinals(a)) - Date.parse(replaceOrdinals(b))
});
console.log(dates);
помните:
от @adeneo в комментариях:Date.parse
is имплантация зависимая. Вы, вероятно, захотите прочитать его документацию, чтобы определить, будут ли такие вещи, как часовые пояса, испортить вещи. В качестве более надежного метода вы можете использовать что-то вроде moment.js для анализа даты.
решением ответ Kevbot является элегантным, но его применение ограничено браузерами ES6 с реализацией date.parse()
который соответствует определенному формату даты, используемому OP.
вместо добавления библиотеки, такой как момент.js просто, чтобы избежать date.parse()
зависимость, специально разработанное решение, которое будет работать в любой среде JavaScript (включая старые браузеры), может быть сделано всего с несколькими строками код:
var dates = [
{'August 17th 2016': [75]},
{'August 1st 2016': [5]},
{'August 28th 2016': [5]}
];
dates.sort(function(a, b){
var i, j;
for(i in a); //get datestring a
for(j in b); //get datestring b;
return MMMDDYYYYtoSortableNumber(i) -
MMMDDYYYYtoSortableNumber(j);
});
console.log(dates);
// MMMDDYYYYtoSortableNumber() converts datestrings
// such as "April 5th 1969" to 19690405.
// Month name to digit approach adapted from
// https://gist.github.com/atk/1053863
function MMMDDYYYYtoSortableNumber(datestring) {
var mdy = datestring.match(/\w(\w\w)\D+(\d+)\D+(\d+)/);
return mdy[3] * 10000 +
' anebarprayunulugepctovec'.search(mdy[1]) * 50 +
mdy[2] * 1;
}
обратите внимание, что было бы безопаснее представлять datestrings как значения объекта, а не ключи объекта. Затем их будет легче извлечь безопасно (и быстрее получить доступ). Е. Г.
{label: 'August 17th 2016', data: [75]},