如何将初始范围值包含在这个从迭代对象中得到的日期列表中?

问题描述 投票:0回答:1

我试着把范围对象做成一个可迭代的对象,以便得到范围限制之间的日期。

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..ofArray.from 我得到了预期的结果

https:/jsfiddle.netatd94h0L

javascript iterator iterable
1个回答
1
投票

如何将初始范围值包含在这个从可迭代的日期列表中?

产生初始值,而不是更新后的当前值。

为什么在使用 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));
© www.soinside.com 2019 - 2024. All rights reserved.