Javascript 如何在数组中前后迭代?

Javascript 如何在数组中前后迭代?,javascript,arrays,math,Javascript,Arrays,Math,我有一个数组和方向变量,例如: var fruits = ["apple","banana","cherry"]; var direction = 1; //1 => forward; -1 => backwards; 那么我可能会说 index = **SOME MATHS HERE** var fruit = fruits[index] 因此,我们的目标是创建一个可以在阵列中前后移动的循环。我想要一个for循环,循环遍历数组。我知道我可以用一个if循环 ifdirecti

我有一个数组和方向变量,例如:

var fruits = ["apple","banana","cherry"];
var direction = 1; 
//1 => forward; -1 => backwards;
那么我可能会说

index = **SOME MATHS HERE** 
var fruit = fruits[index]
因此,我们的目标是创建一个可以在阵列中前后移动的循环。我想要一个for循环,循环遍历数组。我知道我可以用一个if循环 ifdirection<0{//backwards}之类的东西,但这意味着需要两个代码,当我可以使用一个巧妙的数学运算来迭代它时,这意味着需要两个代码


有条件地反转数组如何,这样就不会有那么多代码,因为您似乎希望避免:

if (direction < 0) {
    fruits.reverse();
}
然后,使用for循环,它将根据方向值向后或向前移动。

只需创建一个函数

var fruits = ["apple","banana","cherry"];
var direction = 1;

function iterate(arr, direction, callback){
    if(direction === 1){
        console.log("Forwards");
        for(var i = 0; i < arr.length; i++){
            //Iterate through array regularly
            if(callback !== undefined){
                callback(arr[i]);
            }
        }
    }
    else{
        console.log("Backwards");
        for(var i = arr.length - 1; i >= 0; i--){
            //Iterate through array backwards
            if(callback !== undefined){
                callback(arr[i]);
            }
        }
    }
}

iterate(fruits, direction, function(a){
    console.log(a);
});

iterate(fruits, -direction, function(a){
    console.log(a);
});

看这个

类似的东西会起作用:

var fruits = ["apple","banana","cherry"];
var direction = 1;  // or -1

var i = direction > 0 ? 0 : fruits.length - 1,
    stop = direction > 0 ? fruits.length : -1;
for (; i != stop; i += direction)
    console.log(i, fruits[i]);
var水果=[苹果、香蕉、樱桃]; 函数迭代定向{ var results=$results.empty; var i=方向>0?0:fruits.length-1, 停止=方向>0?长度:-1; 对于;i!=停止;i+=方向 $.texti+:+水果[i]+\n.appendToresults; } 向前地 向后的
这是一个通用的双向循环:

function bdLoop (step, amount[, additional arguments]) {
    var n = (step < 0) ? amount - 1 : 0,
        x, xstep = Math.abs(step);
    for (x = 0; x < amount; x += xstep, n += step) {
        // x always equals to 0 .. amount stepped by xstep
        // n equals to 0 .. amount or amount .. 0 stepped by step, depends on direction (±step)
    }
    return[ results];
}
在循环中,您可以引用外部范围中的变量,处理传递的参数,还可以传递函数引用和调用传递的函数等


.

这是可行的,但这正是OP试图避免的。此外,您忘了调用该函数。没有理由让这过于困难。是的,但举例来说,for循环接受了每个值,并对其进行了一些长而复杂的处理。该过程需要编写两次或使用其他方法才能正常工作。我很确定这就是为什么要避免它。传递一个匿名回调函数,该函数执行您需要查看的编辑操作。循环还意味着做什么?其想法是运行一组动画,以确定对象应如何设置动画,即更改高度,然后更改宽度,然后更改边框等。如果用户想要突然更改反转动画它可以在动画数组中循环并返回。例如,假设我们正在进行边界更改,用户反转动画,应该先执行宽度,然后执行高度。此时此操作已关闭,但出于好奇,我想具体回答此处的一些数学问题,并制作一个比现有答案更紧凑(如果效率较低)的示例。所以我想到的是:数学是Math.absfruits.length-1*方向-我假设我是for循环中从0到fruits.length-1的递增者。也许与直觉相反,我在var dir中使用0表示升序,1表示降序。
function bdLoop (step, amount[, additional arguments]) {
    var n = (step < 0) ? amount - 1 : 0,
        x, xstep = Math.abs(step);
    for (x = 0; x < amount; x += xstep, n += step) {
        // x always equals to 0 .. amount stepped by xstep
        // n equals to 0 .. amount or amount .. 0 stepped by step, depends on direction (±step)
    }
    return[ results];
}