javascript 将自定义值传递给“for..of”循环中迭代器的每次迭代

kiz8lqtg  于 2022-12-25  发布在  Java
关注(0)|答案(1)|浏览(88)

假设我们有一个定制的可迭代对象,如下所示:

class MyIterable {

  val = 1;

  [Symbol.iterator]() {
    return {
      next: () => {
        return {
          done: this.val > 3,
          value: this.val++
        }
      }
    }
  }
}

for(const v of new MyIterable()){
  console.log(v);
}

我的第一个问题是--有没有办法每次都给next()方法传递一个新的值?

class MyIterable {

  val = 1;

  [Symbol.iterator]() {
    return {
      next: (a,b,c) => {  // pass a,b,c
        return {
          done: this.val > a,
          value: this.val + b + c
        }
      }
    }
  }
}

然后用for..of传递a,b,c

let [a, b, c] = [...];
for(const v of new MyIterable(), [a,b,c]){ // bogus syntax
  console.log(v);
  a = 5; //
}

这实际上有一些用例:
1.使用一些更智能内部定义的条件,更早地脱离迭代?
1.过滤结果
然而,我们可以用其他方式来完成这些事情,所以肯定不是那么有用。
因此,我的第二个问题是--就迭代和传递自定义值而言,这是否与它将要达到的效果一样好:

const generate = function*(iterator: Iterator<any>, a, b, c) {
    
      while(1){
        const {done,value} = iterator.next.apply(iterator,[a,b,c]);
        if(done){
          return;
        }
        yield value;
      }
    
    };

可以这样使用:

for(const v of generate(new MyIterable()[Symbol.iterator](), 3,4,5)){
  console.log(v);
}
deyfvvtc

deyfvvtc1#

这会起作用,但不要这样做:

class MyIterable {

  val = 1;

  iterator(v: any){

    const self = this;

    return {
      [Symbol.iterator]() {

        return {
          next: () => {
            const {a,b,c} = v; // get new ref to abc if they change
            return {
              done: self.val > a,
              value: this.val = this.val + b + c
            }
          }
        }
      }
    }
  }

}

const z = {a: 3, b: 4, c: 5}
for(const v of new MyIterable().iterator(z)){
  z.a = 4;
  console.log(v);
}

相关问题