javascript 中的递归生成器

Recursive generator in javascript

我正在尝试创建一个递归生成器,用于生成数组数组的笛卡尔积的元素 例如。 [[1,2,3], [a,b,c]] : [1,a] -> [1,b] -> [1,c] -> [2,a] ..

此 python 代码有效:

def gen(l):
    if not l:
        yield ()
    else:
        for _ in l[0]:
            for __ in gen(l[1:]):
                yield (_,) + __

为什么这个 Javascript 代码没有?

function* cartesianProduct(arrayOfArrays){
    if (arrayOfArrays.length === 0){
        yield []
    }else{
        for(_ of arrayOfArrays[0]){
            for(__ of cartesianProduct(arrayOfArrays.slice(1))){
                yield __.concat([_])
            }
        }
    }
}

我不知道 yield* 如何适应这个。我已经尝试了每一种排列,但它仍然无法正常工作。 Array.from() 表明它有正确的迭代次数,只是返回了错误的东西。我认为这更多是数组处理的问题...

这应该可以解决问题:更改 for(const _ of arrayOfArrays[0])

function* cartesianProduct(arrayOfArrays) {
  if (arrayOfArrays.length === 0) {
    yield [];
  } else {

    for (const _ of arrayOfArrays[0]) {
      for (__ of cartesianProduct(arrayOfArrays.slice(1))) {
        //updated to match your expected order
        yield [_].concat(__)
      }
    }
  }
}


let data = [
  ['1', '2', '3'],
  ['a', 'b', 'c']
];

for (v of cartesianProduct(data)) {
  console.log(v);
}