对于向前和向后计数的循环非常简单,但如果我希望它继续前进然后向后,我可以做2个循环。
然后我有这个想法在一个for循环中做它,它有效,但我不喜欢它的样子,有没有人有更优雅的方式
var array = ['A','B','C','D','E','F'];
for(var x=0,i=0; i<(array.length*2)-1; ++i, x = (i>=array.length)?(array.length-2-(i%array.length)):i){
printf(array[x]);
}
x
最小..max..min
答案 0 :(得分:3)
只要将它扔出去,如果向前 - 向前(最大 - 最小 - 最大)对你有用,你可以这样做:
var array = ['A','B','C','D','E','F'];
for (var c=-(array.length),l=array.length;c<l;c++) {
console.log(array[Math.abs(c)]);
}
输出:
F
E
D
C
B
A
B
C
D
E
F
答案 1 :(得分:1)
你不是在为自己或其他任何人阅读这些代码做任何有利于使事情变得过于复杂的人。代码应该是可读和可维护的。我建议的方法(模拟与Array.prototype.forEach
类似的行为,但不修改原型)是
Array.cycleThrough = function (arr, func, scope) {
'use strict';
var i;
for(i = 0; i < arr.length; i++) {
if(i in arr) {
func.call(scope, arr[i], i, arr);
}
}
for(i = arr.length - 2; i >= 0; i--) {
if(i in arr) {
func.call(scope, arr[i], i, arr);
}
}
};
var foo = ['A', 'B', 'C', 'D'];
Array.cycleThrough(foo, function (current, index, array) {
console.log(current);
});
虽然名称cycleThrough
当然也可以改进。结构取自MDN: Array.prototype.forEach,与ECMAScript尽可能一致。
如您所见,回调函数将使用迭代的当前元素,它所在的索引以及整个数组本身来调用。您还可以传递应在其上调用回调的自定义作用域。
答案 2 :(得分:1)
一个简单的解决方案是镜像和连接数组。
var array = ['A','B','C','D','E','F'];
var reversed = array.slice().reverse(); //["F", "E", "D", "C", "B", "A"]
var mirrored = array.concat(reversed); //["A", "B", "C", "D", "E", "F", "F", "E", "D", "C", "B", "A"]
然后只需要进行常规循环迭代。
答案 3 :(得分:0)
您可以使用变量来跟踪循环的方向:
var array = ['A','B','C','D','E','F'];
for (var i = 0, dir = 1; i > -1; i += dir, dir *= i == array.length - 1 ? -1 : 1) {
console.log(i, array[i]);
}
答案 4 :(得分:0)
也许添加一个“方向”变量。当你到达数组的末尾时,反转方向......对于条件,只要确保你不在数组的开头之前(除非前一次迭代是返回行程的一部分,否则你不会这样做)并且只处理了元素0)。
for (var i = 0, di = 1; i >= 0; i += di) {
if (i == array.length) { di = -1; continue; }
/* do your thing with array[i] */
}
这将访问最后一个元素两次。如果您只想访问一次,请声明
if (i == array.length - 1) { di = -1; }