Array.fill()保留以前选择的月份的日期

时间:2018-12-05 07:56:56

标签: javascript arrays reactjs

我一直在SO和github中寻找一种解释,但找不到。 Array.fill()周围有很多线程,但是似乎没有任何问题可以回答我的问题。 这样就可以了,

const dates = Array(this.props.totalDays).fill().map((e, i) => moment(this.props.selectedDate).day(i+1).format('DD-MM'))

在上面的语句this.props.totalDays中,是一个数字,表示所选月份的天数。例如,从1月开始将是31,在2月,3月和4月将分别选择28和31.30。 this.props.selectedDate是字符串格式的日期(例如:2018年1月1日代表1月,2018年3月1日代表3月等)

我的dates数组以必选格式显示日期,当我选择1月为01-01、01-02,......直到01-31时。

现在,当我选择“二月”时,它变得混乱了,我却不明白为什么? 当我选择2月时,我的dates数组将具有从01-29、01-30、01-31、01-02 ....一直到25-02的数组

现在,当我选择March时,dates数组将为26-02、27-02、28-02、01-03、02-03 ... 28-03

我一直在努力了解发生了什么并且失败了。

任何帮助将不胜感激。

谢谢

维克拉姆

2 个答案:

答案 0 :(得分:2)

moment.day()表示星期几,从0开始。我认为您想设置date()来获取每月的某天。

let totalDays = 28
let selectedDate = '2018-02-01'
const dates = Array(totalDays)
      .fill()
      .map((e, i) => 
         moment(selectedDate).date(i+1).format('MM-DD'))

console.log(dates)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

答案 1 :(得分:1)

我不觉得fill()是引起问题的部分。

在您的示例中,选择“二月”时,您没有期望的值,但有一个包含28个元素的数组。

选择“ 3月”时也一样,这次您确实有31个元素。

鉴于您描述中的信息,我想说问题出在代码的这一部分

moment(this.props.selectedDate).day(i+1).format('DD-MM')

您想在地图功能中做什么?您是否只是尝试用01 / 02、02 / 02、03 / 02,...等值填充数组?

在这种情况下,您不应使用两个不同但密切相关的变量。如果您可以访问选定的月份和选定的年份(对于leap年),则可以执行以下操作:

首先添加这两个助手功能

const zeroPadIfNeeded = aValue => ('0' + aValue).slice(-2)
const daysInMonth = (aYear, aMonth) => new Date(aYear, aMonth, 0).getDate()

然后填写日期数组

let dates = new Array(daysInMonth(this.props.selectedYear, this.props.selectedMonth)).fill().map((e, i) => zeroPadIfNeeded(i + 1) + '-' + zeroPadIfNeeded(this.props.selectedMonth))

selectedMonth从1月1日开始。

关于您现有的代码,如果您可以共享如何设置变量selectedDate的话,可以确定问题出在哪里,因为我坚信这是问题的出处。