【问题标题】:Make a function for a nested for loop为嵌套的 for 循环创建一个函数
【发布时间】:2021-07-04 16:12:14
【问题描述】:

我想为嵌套的 for 循环创建一个函数,以避免复制和粘贴循环。

我可以将嵌套的 for 循环放入一个数组中,这样我只需要复制粘贴一个 for 循环,但这基本上意味着它需要两倍的时间来运行。

当然,我可以保存该数组,因此该函数只需要调用一次,但如果有一种方法可以向该函数发送参数,那就太好了。

我为我的想法写了一个例子:

function exampleForLoop(num){
    let arr = [];
    for (let i = 0; i < 2; i++){
        for (let j = 0; j < num; j++){
            for (let k = 0; k < 3; k++){
                arr.push([i,j,k]);
            }
        }
    }
    return arr;
}

let exampleArr = exampleForLoop(3);
for (let i = 0; i < exampleArr.length; i++){
    console.log(exampleArr[i]);
}

let exampleArr2 = exampleForLoop(1);
for (let i = 0; i < exampleArr2.length; i++){
    console.log(exampleArr2[i]);
}

【问题讨论】:

  • 你面临什么问题?
  • 我想知道是否有一种方法可以在不运行两次 for 循环的情况下做到这一点,或者总体上更好,但我找到了解决方案并回答了我自己的问题。

标签: javascript function for-loop


【解决方案1】:

您甚至可以更进一步,对循环使用递归函数以及每个循环的限制数组(从零开始),并交出一个参数对应于循环值的函数。

function loop(limits, fn, values = [], result = []) {
    if (!limits.length) {
        result.push(fn(...values));
        return result;
    }
    for (let i = 0, l = limits.shift(); i < l; i++) {
        loop([...limits], fn, [...values, i], result);
    }
    return result;
}

loop([2, 3, 3], (...a) => a).forEach(a => console.log(...a));
console.log('');
loop([2, 1, 3], (...a) => a).forEach(a => console.log(...a));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 是的,这与示例完美配合,但是如果您想设置每个循环的开始位置和每个循环的增量,那么它可能有点难以阅读,也有点难以在循环之间做一些事情。不错的答案!
【解决方案2】:

如果您将每个将在 for 循环中的代码设为单独的函数,您可以将这些函数的名称作为 for 循环函数的参数发送,然后您可以使用 functionName(i, j, k) 来打电话给他们。

代码:

function exampleForLoop(functionName, num){
    for (let i = 0; i < 2; i++){
        for (let j = 0; j < num; j++){
            for (let k = 0; k < 4; k++){
                functionName(i, j, k);
            }
        }
    }
}

function exampleFunction1(i, j, k){
    console.log(i, j, k);
}

function exampleFunction2(i, j, k){
    console.log(i, j, k);
}

exampleForLoop(exampleFunction1, 3);
exampleForLoop(exampleFunction2, 1);

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2021-09-16
    • 2016-10-27
    相关资源
    最近更新 更多