代码之家  ›  专栏  ›  技术社区  ›  Vikram Mahishi

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

  •  1
  • Vikram Mahishi  · 技术社区  · 7 年前

    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 this.props.selectedDate

    我的 dates 数组以所需格式显示日期,当我选择1月为01-01,01-02,…一直到01-31。

    现在,当我选择二月时,它会搞砸,我不明白为什么? 当我选择二月我的 日期 阵列将从01-29、01-30、01-31、01-02开始,一直到25-02

    现在当我选择 March 日期 阵列是26-02,27-02,28-02,01-03,02-03……一直到28-03

    我一直在努力理解到底发生了什么,但失败了。

    谢谢

    维克拉姆

    2 回复  |  直到 7 年前
        1
  •  2
  •   Mark    7 年前

    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>
        2
  •  1
  •   Eponyme Web    7 年前

    我不认为fill()是导致问题的部分。

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

    当您选择三月时,同样的事情,这次您确实有31个元素。

    根据您描述中的信息,我认为问题出在代码的这一部分

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

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

    首先添加这两个助手函数

    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))
    

    从1月1日起选择月份。