我试图通过重复添加30分钟来生成一个时间数组。当我这样做时:
let t = new Date();
t.setHours(0, 0, 0, 0);
t.setHours(7);
t.setMinutes(t.getMinutes() + 30);
我有一个代表上午7:30的时间。然而,当我这样做时:
let t = new Date();
t.setHours(0, 0, 0, 0);
t.setHours(7);
let x = [];
while (t.getHours() <= 22) {
t.setMinutes(t.getMinutes() + 30);
x.push(t);
}
return x;
我收到大约30件物品,都是晚上11点。我猜这是因为它们都引用了同一个对象,而不是复制对象。使用for循环做同样的事情。
我该如何在一系列不同的时间内获得我想要的结果?
因为您正在推送一个"日期";对象,t
添加到循环的每次迭代中的数组中。每次修改t
时,实际上就是在修改数组中的所有实例。
您希望在循环的每次迭代中推送一个新的Date
实例。Javascript中的Date类似乎很乐意接受另一个Date实例作为构造函数参数,因此修复非常简单:
只需更改这一行:
x.push(t);
对此:
x.push(new Date(t));
完整解决方案:
let t = new Date();
t.setHours(0, 0, 0, 0);
t.setHours(7);
let x = [];
while (t.getHours() <= 22) {
t.setMinutes(t.getMinutes() + 30);
x.push(new Date(t));
}
return x;
Array.from({length: 500}, (_, i) => new Date(Date.now() + i*1000*60*30))
这是因为您每次都在数组中推送相同的t。代替
t.setMinutes(t.getMinutes() + 30);
使用
let addedTimeInMilliSeonds=t.setMinutes(t.getMinutes(+30(;
x.push(新日期(addedTimeInMilliSeonds((;`
你应该没事的。(如果您不再需要t以前的值(