Как создать массив часов + минут с помощью moment.js и ES6? - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь создать массив часов в день с 30-минутными интервалами с помощью moment.js и ES6.

Пример: let hours = ["12:00 AM", "12:30 AM", "1:00 AM", "1:30 AM", ..., "11:30 PM"]

У меня уже есть for function:

someFunction () {
  const items = []
  for (let hour = 0; hour < 24; hour++) {
    items.push(moment({ hour }).format('h:mm A'))
    items.push(moment({ hour, minute: 30 }).format('h:mm A'))
  }
  return items
}

Но я бы хотел сделать его более похожим на ES6.

Я получил это далеко:

someFunction () {
  let timeSlots = new Array(24).fill().map((acc, index) => {
    let items = []
    items.push(moment( index ).format('h:mm A'))
    items.push(moment({ index, minute: 30 }).format('h:mm A'))
  })
  return timeSlots
}

Но он выдает:

["1:00 AM", "12:30 AM", "1:00 AM", "12:30 AM", "1:00 AM", "12:30 AM", "1:00 AM", "12:30 AM", "1:00 AM", "12:30 AM", "1:00 AM", "12:30 AM", ...]

Ответы [ 5 ]

0 голосов
/ 20 декабря 2018

Я знаю, momentJS было требованием, но также могло быть легко решено с помощью обычных JavaScript Date объектов :

function everyXMilliseconds(x) {
  if (x === void 0) {
    x = 86400000;
  }
  var base = new Date(86400000);
  var currentDate = new Date(86400000);
  var dates = [];
  while (currentDate.getUTCDate() === base.getUTCDate()) {
    dates.push(new Date(currentDate.getTime()));
    currentDate.setTime(currentDate.getTime() + x);
  }
  return dates;
}

function everyXSeconds(x) {
  if (x === void 0) {
    x = 86400;
  }
  return everyXMilliseconds(x * 1000);
}

function everyXMinutes(x) {
  if (x === void 0) {
    x = 1440;
  }
  return everyXSeconds(x * 60);
}

function everyXHours(x) {
  if (x === void 0) {
    x = 24;
  }
  return everyXMinutes(x * 60);
}
//Offsets date with its own timezone difference
function toLocalTime(date) {
  date.setUTCHours(date.getUTCHours() + date.getTimezoneOffset() / 60);
  return date;
}
//TEST
//get dates
var dates = everyXHours(0.5);
// dates to time
console.log('UTC times', dates.map(function(d) {
  return d.toLocaleTimeString("uk");
}));
// dates to time localized
console.log('Local times', dates.map(toLocalTime).map(function(d) {
  return d.toLocaleTimeString("uk");
}));

Мой приведенный выше фрагмент слишком сложен, но он показывает, что вы можете создать действительно гибкую систему без необходимости импорта библиотек.

0 голосов
/ 20 декабря 2018
function someFunction () {
  let items = [];
  new Array(24).fill().forEach((acc, index) => {
    items.push(moment( {hour: index} ).format('h:mm A'));
    items.push(moment({ hour: index, minute: 30 }).format('h:mm A'));
  })
  return items;
}
0 голосов
/ 20 декабря 2018

здесь рабочий код:

someFunction = () => {
  var items = []
  var currentDate = moment('12');
  new Array(48).fill().map((acc, index) => {
    items.push(currentDate.format('h:mm A'))
    currenDate = currentDate.add(30, 'minutes');
  })
  return items
}

console.log(someFunction());

Рабочая скрипка: http://jsfiddle.net/ekqxhwf4/1/

0 голосов
/ 20 декабря 2018

Вы можете использовать метод Array.from для создания 2d-массива, а затем concat с расширенным синтаксисом для создания 1d-массива.

function create () {
  return [].concat(...Array.from(Array(24), (_, hour) => ([
    moment({hour}).format('h:mm A'),
    moment({ hour, minute: 30 }).format('h:mm A')
  ])))
}

console.log(create())
<script src="http://momentjs.com/downloads/moment.js"></script>
0 голосов
/ 20 декабря 2018

Вы можете использовать array#from с array#reduce для генерации 30-минутного интервала времени.

let someFunction = () => {
  return Array.from({length: 24}, (_,i) => i).reduce((r,hour) => {
     r.push(moment({hour, minute: 0}).format('h:mm A'));
     r.push(moment({hour, minute: 30}).format('h:mm A'));
     return r;
  }, []);
}
console.log(someFunction());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
...