因为我有一个业务需要循环获得一个数组里的内容排出不同方案的牌
const cardsArr = ['2_0', '2_1', '2_2', '2_3', '2_4'];
function fun(cards, count) {
const tipArr = [];
let tip = [];
for (let i = 0; i < cards.length; i++) {
for (let j = i + 1; j < cards.length; j++) {
for (let k = j + 1; k < cards.length; k++) {
tipArr[tipArr.length] = [cards[i], cards[j], cards[k]]
}
}
}
console.log(tipArr)
}
fun(cardsArr, 3);
fun(cardsArr, 4);
/**
* 例子
* const cards = ['2_0', '2_1', '2_2', '2_3', '2_4'];
* 输入3
* ['2_0', '2_1', '2_2']
* ['2_0', '2_1', '2_3']
* ['2_0', '2_1', '2_4']
* ['2_0', '2_2', '2_3']
* ['2_0', '2_2', '2_4']
* ['2_0', '2_3', '2_4']
* ['2_1', '2_2', '2_3']
* ['2_1', '2_2', '2_4']
* ['2_1', '2_3', '2_4']
* ['2_2', '2_3', '2_4']
* 输入4
* ['2_0', '2_1', '2_2', '2_3']
* ['2_0', '2_1', '2_2', '2_4']
* ['2_0', '2_2', '2_3', '2_4']
* 输入5
* ['2_0', '2_1', '2_2', '2_3', '2_4']
*/
如何实现出动态循环出该方法,不可能输入3就跳到3的方法里循环,循环4则跳到4的方法里循环
感谢一位网友大佬提供的一个循环方法,为了避免某些人看不懂网友提供的方法我重新写了一下简易版的,也方便直接转换ts版本或某些原因使用不了arguments.callee
方法的人
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
const cardsArr = ['2_0', '2_1', '2_2', '2_3', '2_4'];
const a = choose(cardsArr, 3, [], []);
console.log(a);
// 按照相同方法改了下从闭包换成function
function choose(arr, size, result) {
const allResult = [];
function fun(arr, size, result) {
const arrLen = arr.length;
if (size > arrLen) {
return;
}
if (size === arrLen) {
allResult.push([].concat(result, arr))
} else {
for (let i = 0; i < arrLen; i++) {
const newResult = [].concat(result);
newResult.push(arr[i]);
if (size === 1) {
allResult.push(newResult);
} else {
const newArr = [].concat(arr);
newArr.splice(0, i + 1);
fun(newArr, size - 1, newResult, allResult);
}
}
}
}
fun(arr, size, result);
return allResult;
}
const b = choose1(cardsArr, 3);
console.log(b);
// 网友提供的比包方案
function choose1(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;
}
</script>
</body>
</html>