JavaScript - for循环 vs. 数组shift

6

我有两个函数,它们看起来很相似,但我真正不理解的是,在for循环内部,由于输入是一个数组,为什么不需要任何索引来调用第一个数组?

我有一个数组...

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 applyAndEmpty(input, queue)
{
    var length = queue.length;
    for(var i = 0; i < length; i++)
    {
        input = queue[0](input);
        queue.shift();
    }
    return input;
}

上面的方法给了我答案,但我发现还有另一种写法,即:
var applyAndEmpty = function(input, queue)
{
    var length = queue.length;
    for(var i = 0; i < length; i++)
    {
        input = queue.shift()(input);
    }
    return input;
};

我不理解的部分是input = queue.shift()(input)。队列queue需要索引吗?

3
不行。如果你知道shift()的作用,那就是从数组中执行一个函数并将其从数组栈中移除。 - Roko C. Buljan
1
shift()函数会移除数组中的第一个元素并返回它。但是对于你正在做的事情来说,这种方法效率较低。 - 4castle
@4castle 哇!太感谢了,我完全忘记它会返回元素而不仅仅是删除它。我完全明白了,非常感谢你。 - Dora
2个回答

15

所以你基本上在问 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!!!

使用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()!!!

基本上,它从您的数组中删除一个键并将其返回。
只要该数组具有,它就会循环直到为空。

两者之间的差异是巨大的:
示例1中的for循环将循环但不更改原始数组。
在示例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

以及其他方法


1
我更喜欢你的第一个解释,它直接回答了shift()如何返回和删除元素。谢谢你的回答~ - Dora
shift()()后面的双括号有什么作用,还是打错了?我不想盲目地编辑掉我不知道的语法。 - Adamlive
1
@Adamlive,array.shift() 只是执行了移位操作,而没有实际执行键函数。相反, array.shift()() 会移位并且执行该函数 (因为该函数通过 shift() 方法从函数数组中返回)。从逻辑上讲,如果您的数组不包含函数,则第二对括号不需要。 - Roko C. Buljan
1
@RokoC.Buljan 啊,我没有仔细阅读问题。我跳过了你的答案,因为它非常干净整洁,并且包含了我需要的信息。谢谢! - Adamlive

7
你可以使用 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);
}

输出:

EachArrayValues::100
EachArrayValues::200
EachArrayValues::0
EachArrayValues::400
EachArrayValues::500
EachArrayValues::-50
Negative value found, ie -50

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接