Распространение урожая от генераторов при использовании их таким же образом (повторное использование) - PullRequest
0 голосов
/ 28 июня 2018

У меня есть итератор, который я хочу разбить на функции, например, полный итератор:

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 голосов
/ 28 июня 2018

Вы можете использовать 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])
...