是否可以使用vanilla JavaScript获取所有月份的列表?

时间:2017-07-16 23:50:22

标签: javascript

使用vanilla JS,是否可以获得数月的数组?例如:

filter_(starwars, "species == 'Human' & homeworld %in% c('Tatooine', 'Alderaan') & height > 175")

虽然像moment.js这样的库存在并且使用而不是重新发明轮子是有意义的,但有时候需要/必须在vanilla JS中实现。

2 个答案:

答案 0 :(得分:3)

Date.prototype.toLocaleDateString()可以生成月份名称,因此可以生成包含12个项目的数组,并将每个项目的索引(0 - 11)映射到月份名称。

['January', ..., 'December']

上面的代码记录了几个月的数组:

const months = new Array(12).fill(0).map((_, i) => {
  return new Date(`${i + 1}/1`).toLocaleDateString(undefined, {month: 'long'})
});
console.log(months);

以下是它的工作原理:

  • [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ] 初始化一个长度为12的新数组
  • 在定义了某些项目之前,无法映射数组,因此new Array(12)会将所有项目初始化为.fill(0)
  • 0映射数组的所有12个.map(...)
  • 0是一个忽略第一个参数的函数(它是项目本身,在每种情况下它都是(_, i) => { ... })并且只使用索引,该索引将来自{{1 } 0
  • 0使用MM / DD格式的日期初始化一个新的日期对象,其中月份是从1开始的索引,而月份的日期始终是11。设置日期是必要的,因为否则它默认为今天的日期,如果恰好是> 28,则月份可能会转到下一个月(例如,如果今天是7/31但是i == 2,那么日期将被初始化与2月31日不存在,因此Date对象只在5月产生一天而不是
  • new Date(`${i + 1}/1`)是神奇发生的地方。该对象包含一个formatMatcher对象,该对象控制以字符串形式写出日期的格式。 1属性设置为.toLocaleDateString(undefined, {month: 'long'}),以便生成完整的月份名称(例如month)。有趣的事实:第一个参数是未定义的,因此它不会覆盖用户的默认语言环境。这很棒,因为法国的用户会自动看到法语月份名称:

'long'

如果您想以英文保留月份,只需将此参数设置为"July"

如果有帮助,这里使用旧的JS语法重写相同的代码:

["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]

答案 1 :(得分:0)

我认为使用setMonth比从连续字符串创建日期更有效,更容易理解。



const months= [];
const d = new Date();
for(let month = 0; month < 12; ++month) {
   d.setMonth(month);
   months.push(d.toLocaleString(undefined, {month: 'long'}));
}

console.log(months);
&#13;
&#13;
&#13;