我正在尝试使用moment.js和ES6在一天中创建一个间隔30分钟的小时数组。
示例:
let hours = ["12:00 AM", "12:30 AM", "1:00 AM", "1:30 AM", ..., "11:30 PM"]
我已经拥有此for
功能:
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", ...]
答案 0 :(得分:2)
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;
}
答案 1 :(得分:1)
您可以将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>
答案 2 :(得分:1)
这是工作代码:
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/
答案 3 :(得分:1)
您可以使用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>
答案 4 :(得分:1)
我知道momentJS是必要条件,但也可以通过普通的JavaScript Date objects轻松解决:
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");
}));
我上面的代码片段有点过于复杂,但是它说明您无需导入库就可以创建真正灵活的系统。
答案 5 :(得分:0)
您可以使用标签获取值。
function someFunction () {
const items = [];
new Array(24).fill().forEach((acc, index) => {
items.push({"value": moment( {hour: index} ).format('HH:mm'), "label": moment( {hour: index} ).format('h:mm A')});
items.push({"value": moment({ hour: index, minute: 30 }).format('HH:mm'), "label": moment({ hour: index, minute: 30 }).format('h:mm A')});
})
return items;
}
答案 6 :(得分:0)
一个更短的版本是:
const someFunction = () =>
Array(48)
.fill()
.map((_, index) =>
moment({
hour: Math.floor(0.5 * index),
minute: 30 * (index % 2)
})
.format("h:mm A"));