已知有数组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>
可以同时拥有华为手机和苹果手机么