已知有数组arr = [[苹果手机,小米手机,华为手机],[苹果手表,小米手表,华为手表,小天才手表],[亚索手办,盲僧手办,阿狸手办],[冰墩墩红,冰墩墩白]]
需求是计算 如果每人能得到2项奖品 那么这两项奖品有多少种组合?
又或者是3项 4项 各有多少种组合
如何写才能使后续添加奖项也不影响算法
JS求二维数组指定长度的组合数量
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
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)本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录