У меня есть объект, который выглядит следующим образом

{
  "8 am": 2,
  "11 am": 6,
  "12 pm": 3,
  "5 pm": 7,
  "1 pm": 0
}

Я использую код ниже, чтобы отсортировать объект с помощью ключей.

const ordered: any = {};
Object.keys(groupedData).sort().map((key) => {
     ordered[key] = groupedData[key];
});

Я получаю результат следующим образом

 {
  "1 pm": 0,
  "8 am": 2,
  "11 am": 6,
  "12 pm": 3,
  "5 pm": 7,
}

Однако мне нужно что-то вроде этого

 {
  "8 am": 2,
  "11 am": 6,
  "12 pm": 3,
  "1 pm": 0,
  "5 pm": 7
}

Как я могу добиться этого в машинописи или JavaScript. Решения с плагинами также приветствуются.

0
Tatenda 16 Янв 2020 в 13:04

2 ответа

Лучший ответ

Создайте функцию, которая может преобразовывать строку в соответствующее значение часа (например, 8 am -> 8, 3 pm -> 15), затем .sort с помощью эта функция:

const groupedData = {
  "8 am": 2,
  "11 am": 6,
  "12 pm": 3,
  "5 pm": 7,
  "1 pm": 0
}
const ordered = {};
const getVal = (str) => {
  if (str === '12 pm') {
    return 12;
  }
  const [num, ampm] = str.split(' ');
  return (ampm === 'pm') * 12 + Number(num);
};
Object.keys(groupedData).sort((a, b) => getVal(a) - getVal(b)).map((key) => {
  ordered[key] = groupedData[key];
});
console.log(ordered);

Более элегантно, используя Object.fromEntries:

const groupedData = {
  "8 am": 2,
  "11 am": 6,
  "12 pm": 3,
  "5 pm": 7,
  "1 pm": 0
}

const getVal = (str) => {
  if (str === '12 pm') {
    return 12;
  }
  const [num, ampm] = str.split(' ');
  return (ampm === 'pm') * 12 + Number(num);
};
const ordered = Object.fromEntries(
  Object.entries(groupedData).sort((a, b) => getVal(a[0]) - getVal(b[0]))
);
console.log(ordered);
3
CertainPerformance 16 Янв 2020 в 10:08

Сделайте пользовательскую функцию для сортировки ключей:

function sortHours(a, b) {
  const [aParsed, bParsed] = [a, b].map(x => {
    let [num, str] = x.split(' ');
    num = str === 'pm' ? num + 12 : num;
    return num;
  })
  return aParsed > bParsed ? 1 : -1;
}

И сортировать их:

Object.keys(a).sort(sortHours)

Вы также должны оставить отсортированный объект как массив, так как Javascript не сохраняет порядок на ключах объекта.

0
ritaj 16 Янв 2020 в 10:14