代码之家  ›  专栏  ›  技术社区  ›  liborm

我如何批量(大小相等的块)消费一个iterable?

  •  2
  • liborm  · 技术社区  · 5 年前

    我经常用 batch() 在蟒蛇中。自ES6以来,Javascript中是否有其他的选择,它具有迭代器和生成器功能?

    1 回复  |  直到 5 年前
        1
  •  3
  •   Bergi    5 年前

    我必须自己写一封信,我在这里和其他人分享,以便在这里轻松找到:

    // subsequently yield iterators of given `size`
    // these have to be fully consumed
    function* batches(iterable, size) {
      const it = iterable[Symbol.iterator]();
      while (true) {
        // this is for the case when batch ends at the end of iterable
        // (we don't want to yield empty batch)
        let {value, done} = it.next();
        if (done) return value;
    
        yield function*() {
          yield value;
          for (let curr = 1; curr < size; curr++) {
            ({value, done} = it.next());
            if (done) return;
    
            yield value;
          }
        }();
        if (done) return value;
      }
    }
    

    它产生发电机,而不是 Array 例如S。在调用之前,必须完全使用每个批 next() 再说一遍。