qq_30365981 2022-11-18 22:52 采纳率: 100%
浏览 2
已结题

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

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

  • 写回答

3条回答 默认 最新

  • 游一游走一走 2022-11-19 10:08
    关注
    // 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)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月27日
  • 已采纳回答 11月19日
  • 创建了问题 11月18日