JS求二维数组指定长度的组合数量

已知有数组arr = [[苹果手机,小米手机,华为手机],[苹果手表,小米手表,华为手表,小天才手表],[亚索手办,盲僧手办,阿狸手办],[冰墩墩红,冰墩墩白]]
需求是计算 如果每人能得到2项奖品 那么这两项奖品有多少种组合?
又或者是3项 4项 各有多少种组合
如何写才能使后续添加奖项也不影响算法

// arr和prizeNum是变量可以随便改奖项和中奖商品数量
const arr = [["苹果手机", "小米手机", "华为手机"], ["苹果手表", "小米手表", "华为手表", "小天才手表"], ["亚索手办", "盲僧手办", "阿狸手办"], ["冰墩墩红", "冰墩墩白"]]
const prizeNum = 2

/**
 * 获取所有的组合
 * @param arr
 * @param size
 * @returns {*[]}
 */
function choose(arr, size) {
    var allResult = [];

    (function (arr, size, result) {
        var arrLen = arr.length;
        if (size > arrLen) {
            return;
        }
        if (size == arrLen) {
            allResult.push([].concat(result, arr))
        } else {
            for (var i = 0; i < arrLen; i++) {
                var newResult = [].concat(result);
                newResult.push(arr[i]);

                if (size == 1) {
                    allResult.push(newResult);
                } else {
                    var newArr = [].concat(arr);
                    newArr.splice(0, i + 1);
                    arguments.callee(newArr, size - 1, newResult);
                }
            }
        }
    })(arr, size, []);

    return allResult;
}

/**
 * 获取多维的笛卡尔积
 * @param arr
 * @returns {*}
 */
const mix = (arr) => {
    const help = (a, b) => {
        if (!a.length) return b;
        return a.map(e => b.map(u => {
            const temp = Array.isArray(e) ? e : [e]
            return [...temp, u]
        })).reduce((pre, e) => pre.concat(e), [])
    }
    return arr.reduce((cur, e) => help(cur, e), [])
}

data = choose(arr, prizeNum) //选择两个大类的组合共6组
result = data.reduce((t, i) => t.concat(mix(i)), []) //2个大类组合里面取笛卡尔积
console.log(result)

每人能得到4项奖品 组合排序如下

<!DOCTYPE html>
<html>

<head>
  <title>Showing and Hiding Elements</title>
  <!--  <link rel="stylesheet" href="style.css" /> -->
  <!-- <script type="text/javascript" src="https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
  <!-- <script src="https://code.jquery.com/jquery-3.6.1.min.js"></script> -->
  <script type="text/javascript">
    function doExchange(doubleArrays){
    var len=doubleArrays.length;
    if(len>=2){
        var len1=doubleArrays[0].length;
        var len2=doubleArrays[1].length;
        var newlen=len1*len2;
        var temp=new Array(newlen);
        var index=0;
        for(var i=0;i<len1;i++){
            for(var j=0;j<len2;j++){
                temp[index]=doubleArrays[0][i]+
                    doubleArrays[1][j];
                index++;
            }
        }
        var newArray=new Array(len-1);
        for(var i=2;i<len;i++){
            newArray[i-1]= doubleArrays[i];
        }
        newArray[0]=temp;
        return doExchange(newArray);
    }
    else{
        return doubleArrays[0];
    }
}
    var temparr =[["苹果手机","小米手机","华为手机"],
    ["苹果手表","小米手表","华为手表","小天才手表"],
    ["亚索手办","盲僧手办","阿狸手办"],
    ["冰墩墩红","冰墩墩白"]];
    var ret = doExchange(temparr);
    console.log("共有:" + ret.length + "种组合!");

    for (var i = 0; i < ret.length; i++) {
      console.log(ret[i]);

    }
  </script>
  <style type="text/css">

  </style>
</head>

<body>
</body>

</html>

img

可以同时拥有华为手机和苹果手机么