#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);