Как отсортировать список моментов и часовых поясов? - PullRequest
0 голосов
/ 05 февраля 2020

Я хочу показать список моментов и часовых поясов в порядке возрастания в раскрывающемся меню. По умолчанию они сортируются в алфавитном порядке. Но мое требование - сортировать их по Гринвичу в порядке возрастания.

до сортировки:

[
  '(GMT+00:00) Africa/Abidjan',
  '(GMT+00:00) Africa/Accra',
  '(GMT+03:00) Africa/Addis_Ababa',
  '(GMT+01:00) Africa/Algiers',
  '(GMT+03:00) Africa/Asmara',
  '(GMT+03:00) Africa/Asmera',
  '(GMT+00:00) Africa/Bamako',
  '(GMT+01:00) Africa/Bangui',
]

после сортировки:

[
  '(GMT+00:00) Africa/Abidjan',
  '(GMT+00:00) Africa/Accra',
  '(GMT+00:00) Africa/Bamako',
  '(GMT+01:00) Africa/Algiers',
  '(GMT+01:00) Africa/Bangui',
  '(GMT+03:00) Africa/Addis_Ababa',
  '(GMT+03:00) Africa/Asmera',
  '(GMT+03:00) Africa/Asmara',
]

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Короче твоего, Ашик. Нет необходимости дважды обращаться к часовому поясу из массива

const getTimeZoneList = moment.tz.names()
  .map(t => `(GMT${moment.tz(t).format("Z")}) ${t}`);
const sortByZone = (a,b) => { 
  let [ahh,amm] = a.split("GMT")[1].split(")")[0].split(":"); 
  let [bhh,bmm] = b.split("GMT")[1].split(")")[0].split(":");
  return (+ahh*60+amm) - (+bhh*60+bmm)
};
console.log(getTimeZoneList.sort(sortByZone))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.27/moment-timezone-with-data-2012-2022.min.js"></script>
0 голосов
/ 05 февраля 2020

Вы можете получить отсортированный список, выполнив это

const timeZones = moment.tz.names();

const getTimeZoneList = () =>
  timeZones.map(
    (t, i) => `(GMT${moment.tz(timeZones[i]).format("Z")}) ${timeZones[i]}`
  );

const sortByGmt = () => {
  const timeZone = getTimeZoneList();
  return timeZone.sort((a, b) => {
    const re = /^\(GMT([+-]\d{1,2}):(\d{1,2})\).*$/;
    const aOffset = parseFloat(a.replace(re, "$1.$2"));
    const bOffset = parseFloat(b.replace(re, "$1.$2"));
    return aOffset < bOffset ? -1 : aOffset > bOffset ? 1 : 0;
  });
};
console.log(sortByGmt())
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.27/moment-timezone-with-data-2012-2022.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...