从生成器传播收益,同时以相同的方式使用它们(重用)

Propagate yield from generators while using them in the same way (reuse)

我有一个迭代器,我想分解成函数,例如,完整的迭代器:

export function* myIterator(foo) {
 for (const xs of foo) {
   for (const ys of xs.y) {
    for (const zs of ys.z) {
      if (zs) {
        for (const qs of zs.q) {
          if (qs) {
            yield qs;
          }
        }
      }
    }
   }
 }
}

收件人:

export function* myIterator(xs) {
   for (const ys of xs.y) {
    for (const zs of ys.z) {
      if (zs) {
        for (const qs of zs.q) {
          if (qs) {
            yield qs;
          }
        }
      }
    }
   }
}

function* myOuterIterator(foo) {
  for (const xs of foo) {
    yield myIterator(xs);
  }
}

但这不会在 for of 中保持相同的行为。有没有办法重用生成器?

(从 myOuterIterator 中删除收益率也无济于事)

您可以使用 yield* 得到 myIterator 的结果:

function* myIterator(xs) {
    for (const ys of xs.y) {
     for (const zs of ys.z) {
       if (zs) {
         for (const qs of zs.q) {
           if (qs) {
             yield qs;
           }
         }
       }
     }
    }
 }

 function* myOuterIterator(foo) {
    for (const xs of foo) {
      yield *myIterator(xs);
    }
  }

let f = [
    {y: [{z: [{q:[10]}]}, {z: [{q:[20]}]}, {z: [{q:[30]}]}]},
    {y: [{z: [{q:[100]}]}, {z: [{q:[200]}]}, {z: [{q:[300]}]}]}
]

let gen = myOuterIterator(f)
console.log([...gen])