如果reverse == true
我想运行一种循环,否则我想运行另一种循环。
目前,这是我的代码示例:
if (reverse) {
for (var i = 0; i < length; i++) {
...
}
} else {
for (var i = length; i >= 0; i--) {
...
}
}
里面的代码确实很大,并且完全一样。我可以使用一个函数,但是此函数会有太多参数,这不是一个好选择。
所以我试图做这样的事情:
var loopStart1 = startPageIndex;
if (!reverse) {
condition1 = function(i) {
return i < length;
}
increment1 = function(i) {
return ++i;
}
} else {
condition1 = function(i) {
return i >= 0;
}
increment1 = function(i) {
return i--;
}
}
mainLoop: for (var i = loopStart1; condition1(i); increment1(i)) {
但是现在我有一个无限循环。
关于如何解决此问题的任何想法?
答案 0 :(得分:4)
为什么不内联?! ;)
var start = startPageIndex;
for (var i = start; (reverse && i >= 0) || (!reverse && i < length); reverse ? --i : ++i) { }
答案 1 :(得分:3)
假设特定情况是向后或向前遍历数组,则有两种简单的方法可以做到这一点。
1)只是在循环之前有条件地反转数组,或者
2)使用单个循环,但有条件地将循环变量映射到其他对象。像...
for (var i = 0; i < length; i++) {
var j = i;
if (reverse) {
j = length - (i + 1);
}
// ...then use j instead of i
}
答案 2 :(得分:1)
如果要使其动态化,我不会使用for循环,而是使用do..while循环来更易于自定义。
您的主要功能只有一个简单的反向布尔标志,您可以通过它。
在要依赖反向标志的函数中,可以在条件(x ? y : z)
下使用三元表达式
使阅读更加清晰。从理论上讲,您可以使用两个三元方向直接在for循环中完成此操作。
do {
//Your actions here, using i as counter
//Here you will do the counter direction change
if(reverse)
i--;
else
i++;
// Use ternary expression if (x ? y : z) in the while condition
// Reads as: If x is true, do y, else do z
// All in one line
} while(reverse ? i>=0 : i<n);
理想情况下,在这种情况下,我会考虑使用迭代器。
答案 3 :(得分:0)
选中https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions
原始参数(例如数字)通过值传递给函数;值将传递给函数,但是如果函数更改了参数的值,则此更改不会在全局或调用函数中反映出来。
当您调用increment1(i)
,for循环中的外部i
不变时,会发生这种情况。要解决此问题,只需从增量1(i)的返回值中设置i
。
mainLoop: for (var i = loopStart1; condition1(i); i = increment1(i)) {
答案 4 :(得分:0)
我会选择相同的代码,只是更改数组。
var array = ['one', 'two', 'three'];
var reversed = true;
let arrToUse = reversed ? array.reverse() : array;
for (var i = 0; i < arrToUse.length; i++) {
console.log(arrToUse[i]);
}
答案 5 :(得分:0)
一个简单的循环函数怎么样
下面,我创建了一个名为myLoop
的简单函数,是否可以传递length
,是否传递reversed
以及每次循环迭代需要的回调函数。
例如
function myLoop(length, reverse, each) {
var index;
if (!reverse) {
for (index = 0; index < length; index ++) each(index);
} else {
for (index = length -1; index >= 0; index --) each(index);
}
}
function show(index) {
console.log("Loop index = " + index);
}
console.log("forward");
myLoop(5, false, show); //normal
console.log("revere");
myLoop(5, true, show); //reversed