js如何实现动态for循环

因为我有一个业务需要循环获得一个数组里的内容排出不同方案的牌

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>
JavaScript中,可以使用递归来模拟实现for循环的效果。递归就是方法调用自身来实现循环的效果。具体实现如下: ```javascript function recursiveForLoop(i, n) { if (i < n) { // 执行循环操作 // 递归调用自身,增加i的值 recursiveForLoop(i + 1, n); } } recursiveForLoop(0, 10); ``` 以上代码中,`recursiveForLoop`函数接受两个参数,`i`表示当前循环的索引,`n`表示循环的总次数。在函数内部,首先判断`i`是否小于`n`,如果是,则执行循环操作,并通过递归调用自身来增加`i`的值,实现下一次循环。当`i`大于等于`n`时,递归停止。 使用递归实现for循环可以有效解决在循环中执行异步操作导致顺序错乱的问题,保证了每次循环都能按顺序输出数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [神奇的递归:Javascript递归代替for循环 解决循环调用异步操作时数据顺序错乱](https://blog.csdn.net/qq_38661984/article/details/84679557)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [递归替换for循环遍历](https://blog.csdn.net/PDX_li/article/details/113848231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值