以相同的方式使用发电机时提高发电机的产量(重复使用)

时间:2018-06-28 14:30:58

标签: javascript generator yield reusability

我有一个要分解为功能的迭代器,例如完整的迭代器:

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中删除收益也无济于事)

1 个答案:

答案 0 :(得分:1)

您可以使用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])