我想在数组中添加几个月,但是我无法让MomentJS的add()函数正常工作。这是怎么回事:
function getMonths(begin, end){
var cursor = moment(begin);
var momentEnd = moment(end);
var arrayMonths = [];
while(cursor.month() != momentEnd.month() || cursor.year() != momentEnd.year()){
cursor.add(1, 'month'); // Actually adds one month to the cursor
console.log(cursor.toDate()); // Because this display the cursor with an added month
arrayMonths.push(cursor.toDate()); // However the cursor being pushed doesn't have this added month
console.log(arrayMonths); // verified here
}
return arrayMonths;
}
控制台日志显示游标实际上已经增加(因为add()是一个mutator)但是它的正确值没有被添加到数组中。
我无法弄清楚这是我的代码中的问题还是MomentJS固有的问题。有人有任何线索吗?
谢谢!
答案 0 :(得分:3)
toDate
的文档说:
要获取Moment.js包装的本机Date对象,请使用#adDate。
这将返回当前使用的日期,因此对该日期的任何更改都将导致时刻发生变化。如果您想要一个作为副本的日期,请在使用#toDate时刻之前使用#cron。
IE每次拨打Date
时,您都会获得相同的基础toDate
对象 - 即每次调用add
也会修改它,并且数组的每个成员实际上都是同一个对象。
如果您按照文档说的那样操作,并使用clone
,则代码可以正常运行:
arrayMonths.push(cursor.clone().toDate());
这是一个演示:
function getMonths(begin, end){
var cursor = moment(begin);
var momentEnd = moment(end);
var arrayMonths = [];
while(cursor.month() != momentEnd.month() || cursor.year() != momentEnd.year()){
cursor.add(1, 'month'); // Actually adds one month to the cursor
console.log(cursor.toDate()); // Because this display the cursor with an added month
//clone the object before pushing, to ensure it's not further modified
arrayMonths.push(cursor.clone().toDate());
console.log(arrayMonths); // verified here
}
return arrayMonths;
}
getMonths(moment('2016/01/01', 'YYYY/MM/DD'), moment('2017/01/01', 'YYYY/MM/DD'));

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.js"></script>
&#13;
答案 1 :(得分:-1)
由于您的代码看起来不错,不完全确定这里发生了什么。
然而,我会尝试使用临时变量来仔细检查发生了什么。
function getMonths(begin, end){
var cursor = moment(begin);
var momentEnd = moment(end);
var arrayMonths = [];
while(cursor.month() != momentEnd.month() || cursor.year() != momentEnd.year()){
cursor.add(1, 'month');
var cursorDate = cursor.toDate();
console.log(cursorDate); // temporary variable - no chance it gets mutated etc...
arrayMonths.push(cursorDate);
console.log(arrayMonths);
}
return arrayMonths;
}