javascript 中的递归 forEach()

Recursive forEach() in javascript

我有一堆数字数组,例如:

let a = [1,2,3];
let b = [4,5,7];
let c = [11,13,17]

我想创建一个函数,告诉我数组中的数字组合乘以不同数组中的数字得到某个数字。以下是我目前的代码:

// to get which combination of numbers result to 165
a.forEach(x=>{
    b.forEach(y=>{
        c.forEach(z=>{
        if(x*y*z==165){
            console.log(x,y,z)
        }
        })
    })
})

我想创建一个函数,可以将数字数组输入数组,例如:[[1,2],[2,5,],[7,11],[13,17]] 并返回数字组合,当相乘时,可以得到某个数字.

这是一个递归函数,它接受一个输入数字和数字数组的数组。它处理第一个数字数组,找到任何可能的除数,如果是,则使用除法输入和数组的余额递归调用自身,以查看该对值是否有任何除数。如果是这样,它们将附加到当前除数以产生结果:

const findDivisors = (num, arrs) => {
  let result = [];
  if (arrs.length == 1) {
    return arrs[0].filter(n => n == num);
  }
  arrs[0].forEach(n => {
    if (num % n === 0) {
      findDivisors(num / n, arrs.slice(1)).forEach(r => result.push([n].concat(r)));
    }
  });
  return result;
}

let a = [1, 2, 3];
let b = [4, 5, 7];
let c = [11, 13, 17];
console.log(findDivisors(165, [a, b, c]));
console.log(findDivisors(136, [a, b, c]));

这表达了与 Nick 的回答相同的算法,但写法非常不同:

const findDivisors = (t, [ns, ...nss]) =>
  nss .length == 0
    ? ns .filter (n => n == t) .map (n => [n])
    : ns .flatMap (n => t % n == 0 ? findDivisors (t / n, nss) .map (ns => [n, ...ns]) : [])

const ns = [
  [1, 2, 3, 5, 6, 9],
  [2, 3, 4, 8, 12],
  [3, 5, 9, 12, 16, 18]
]

console .log (findDivisors (100, ns))
console .log (findDivisors (144, ns))
console .log (findDivisors (240, ns))
.as-console-wrapper {max-height: 100% !important; top: 0}

我更喜欢使用表达式而不是语句。但据我所知,除了风格问题外,它与尼克的回答没有任何优势或劣势。

最好也处理空数组的可能性,它可能看起来像:

const findDivisors = (t, [ns, ...nss]) =>
  ns == undefined
    ? []
  : nss .length == 0
    ? ns .filter (n => n == t) .map (n => [n])
    : ns .flatMap (n => t % n == 0 ? findDivisors (t / n, nss) .map (ns => [n, ...ns]) : [])