Создайте функцию для вложенного цикла for

#javascript #function #for-loop

Вопрос:

Я хочу создать функцию для вложенного цикла 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]);
} 

Комментарии:

1. в чем проблема, с которой вы столкнулись?

2. Я хотел знать, есть ли способ сделать это без повторного запуска цикла for или просто в целом лучше, но я нашел решение и ответил на свой собственный вопрос.

Ответ №1:

Вы можете пойти еще на шаг вперед и использовать рекурсивную функцию для циклов вместе с массивом ограничений для каждого цикла (начиная с нуля) и передать функцию, параметры которой соответствуют зацикленным значениям.

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

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; } 

Комментарии:

1. Да, это отлично работает с примером, но если вы хотите установить, где начинается каждый цикл, и приращение для каждого из них, то это может быть немного сложно прочитать, а также немного сложно что-то делать между циклами. Хороший ответ, тхо!

Ответ №2:

Если вы сделаете каждый код, который будет находиться в цикле for, отдельной функцией, вы можете отправить имена этих функций в качестве параметра функции цикла for, а затем вы можете использовать имя функции(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);