如何在时间戳中保留唯一的月份

时间:2018-08-02 14:17:56

标签: javascript reactjs ecmascript-6

我想创建一个包含唯一月份(2015年8月,2015年9月等)的数组。为此,我定义了以下函数,该函数将带有时间戳记的对象作为键:

export function getUniqueMonths(exps) {

  //1. get all keys from expenditures
  const days = Object.keys(exps)

  //2. convert key strings to timestamps
  const daysInt = days.map((day) => (new Date(parseInt(day))))

  //3. return only the "date portion" of the timestamp
  const datePortion = daysInt.map((day) => (new Date(day.toDateString()) ))

  //4. set each datePortion to 1st of month
  const firstOfMonth = datePortion.map((day) => new Date(day.getFullYear(), day.getMonth(), 1)  )

  //5. keep only unique firstOfMonths
  const uniqMonths = [...(new Set(firstOfMonth))]

  return uniqMonths
}

但是,此函数给了我这样的数组:

[Sat Aug 01 2015 00:00:00 GMT+0300 (Eastern European Summer Time), Sat Aug 01 2015 00:00:00 GMT+0300 (Eastern European Summer Time), Tue Sep 01 2015 00:00:00 GMT+0300 (Eastern European Summer Time), Sat Aug 01 2015 00:00:00 GMT+0300 (Eastern European Summer Time), Sat Aug 01 2015 00:00:00 GMT+0300 (Eastern European Summer Time), ...]

我认为获取时间戳的日期部分(步骤3)并将所有日期设置为月初(步骤4)将达到目的。但是我的数组中仍然有重复项。

我想念什么?

2 个答案:

答案 0 :(得分:4)

我认为您可能会过度设计:)

function getUniqueMonths(exps) {
  const uniqueMonths = new Set();
  Object.keys(exps).forEach((timestamp) => {
    const date = new Date(parseInt(timestamp));  // expected to be milliseconds since 1/1/1970
    uniqueMonths.add(`${date.getFullYear()}-${date.getMonth()}`);
  });
  return uniqueMonths;
}

应该以{{1​​}}的形式给您带来一组独特的月(JavaScript标准中从零开始的月)。

如果您需要['2017-12', '2018-0', ...]对象,那么这些对象对于“补水”来说是微不足道的。

答案 1 :(得分:1)

两个Date对象不是同一对象,即使它们包含相同的时间戳。

相反,请尝试:

//3. keep the year-month portion of the date
const yearMonths = daysInt.map(day => day.getFullYear()+"-"+day.getMonth());

然后,您可以跳过4,然后从那里获取唯一的年份-月份。例如,这些内容将在2015年8月以"2015-7"的形式返回。