Как сортировать массив объектов, где ключи-даты

Я искал этот вопрос, и, похоже, не существует ответа. Рассмотрим следующее:

[
  { '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]},