JavaScript - 用于循环与数组移位

Dor*_*ora 4 javascript arrays for-loop function shift

我有两个函数,它们看起来很相似,但我真的不明白是在for-loop 里面,因为输入是一个数组,为什么数组不需要任何索引来调用第一个数组?

我有一系列...

var puzzlers = [
function(a) { return 8 * a - 10; },
function(a) { return (a - 3) * (a - 3) * (a - 3); },
function(a) { return a * a + 4; },
function(a) { return a % 5; }
];
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用输入循环遍历数组.然后,第一个函数的结果将用作下一个函数的输入,然后将删除第一个数组.

这就是我写的......

function applyAndEmpty(input, queue)
{
    var length = queue.length;
    for(var i = 0; i < length; i++)
    {
        input = queue[0](input);
        queue.shift();
    }
    return input;
}
Run Code Online (Sandbox Code Playgroud)

以上确实给了我答案,但后来我发现还有另一种写作方式

var applyAndEmpty = function(input, queue)
{
    var length = queue.length;
    for(var i = 0; i < length; i++)
    {
        input = queue.shift()(input);
    }
    return input;
};
Run Code Online (Sandbox Code Playgroud)

我不明白的是这部分input = queue.shift()(input).

难道不是queue需要一个指数?

Rok*_*jan 12

所以你基本上都在问你到底shift做了
什么:用你可以做什么for(var i=0;......你可以做什么shift()(非常相似但不是!)

使用for循环(和index)

var array = [
  function(){return "a";},
  function(){return "b";}
];
  
for(var i=0; i<array.length; i++){
    console.log( array[i]() );  
    // "a"
    // "b"
}

console.log(array.length); //2       !!Still there!!!
Run Code Online (Sandbox Code Playgroud)

使用shift()(while例如)

var array = [
  function(){return "a";},
  function(){return "b";}
];
  
while(array.length){                // while array has length
    console.log( array.shift()() );  // execute and remove from array
    // "a"
    // "b"
}

console.log(array.length); //0   !!!Empty array due to shift()!!!
Run Code Online (Sandbox Code Playgroud)

所以基本上它会从你的数组中删除一个键并返回它.
只要该数组具有键,它就会循环直到它为空.

两者之间的区别是剧烈的:
for实例1循环将循环,但不会改变原来的数组.在示例2中
使用shift().您将(使用和)逐个删除数组键.

阅读更多关于数组操作:

Array.prototype.shift 1 <-- [2,3,4]
Array.prototype.unshift 5 --> [5,2,3,4]
Array.prototype.push [5,2,3,4,6] <-- 6
Array.prototype.pop [5,2,3,4] --> 6

和其他方法


Mic*_*rdi 6

您可以使用Array.reduce简化逻辑

在这里你如何做到这一点:

var puzzlers = [
function(a) { return 8 * a - 10; },
function(a) { return (a - 3) * (a - 3) * (a - 3); },
function(a) { return a * a + 4; },
function(a) { return a % 5; }
];

function runPuzzler(inputValue){
   return puzzlers.reduce(function(prev, curr){
       return curr(prev);
   },inputValue);
}
Run Code Online (Sandbox Code Playgroud)