我想创建一个包含唯一月份(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)将达到目的。但是我的数组中仍然有重复项。
我想念什么?
答案 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"
的形式返回。