我试着把范围对象做成一个可迭代的对象,以便得到范围限制之间的日期。
let range = {
from: new Date("2020-01-01"),
to: new Date("2020-01-10"),
};
range[Symbol.iterator] = function () {
return {
current: this.from,
last: this.to,
next() {
if (this.current.getTime() < this.last.getTime()) {
return {
done: false,
value: new Date(this.current.setDate(this.current.getDate() + 1)),
};
}
return { done: true };
},
};
};
for (const iterator of range) {
console.log(iterator);
}
console.log(Array.from(range));
我试图做的,但不成功的是,范围的起始日期包含在日期列表中,在这种情况下,2020-01-01。
关于我们 for..of
当前结果
2020-01-02T00:00:00.000Z
2020-01-03T00:00:00.000Z
2020-01-04T00:00:00.000Z
2020-01-05T00:00:00.000Z
2020-01-06T00:00:00.000Z
2020-01-07T00:00:00.000Z
2020-01-08T00:00:00.000Z
2020-01-09T00:00:00.000Z
2020-01-10T00:00:00.000Z
预期结果
2020-01-01T00:00:00.000Z <-- initial value
2020-01-02T00:00:00.000Z
2020-01-03T00:00:00.000Z
2020-01-04T00:00:00.000Z
2020-01-05T00:00:00.000Z
2020-01-06T00:00:00.000Z
2020-01-07T00:00:00.000Z
2020-01-08T00:00:00.000Z
2020-01-09T00:00:00.000Z
2020-01-10T00:00:00.000Z
关于我们 Array.from
当前结果
[]
预期结果
[2020-01-01T00:00:00.000Z, 2020-01-02T00:00:00.000Z..., 2020-01-10T00:00:00.000Z]
我的另一个问题是,为什么在使用 Array.from(range)
我希望得到一个包含日期的数组,但它返回的是一个空数组。
更新0
这是同样的练习,只是对整数进行了练习,并使用了 for..of
和 Array.from
我得到了预期的结果
如何将初始范围值包含在这个从可迭代的日期列表中?
产生初始值,而不是更新后的当前值。
为什么在使用
Array.from(range)
它返回一个空数组?
因为你的代码确实修改了 range.from
日期对象。当你循环过这个范围后,它就会被用完,而 range.from
(== range.current
)是 >=
range.to`。
所以为了解决这两个问题。
let range = {
from: new Date("2020-01-01"),
to: new Date("2020-01-10"),
};
range[Symbol.iterator] = function () {
return {
current: this.from,
last: this.to,
next() {
const cur = this.current;
if (cur < this.last) {
this.current = new Date(cur);
// ^^^^^^^^
this.current.setDate(cur.getDate() + 1)
return {
done: false,
value: cur,
};
}
return { done: true };
},
};
};
for (const iterator of range) {
console.log(iterator);
}
console.log(Array.from(range));