JavaScript - for 循环与数组移位
JavaScript - for Loop vs. Array shift
我有两个函数,它们看起来很像,但我真正不明白的是在 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
不需要索引吗?
您可以使用 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);
}
所以你基本上是在问 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()!!!
所以基本上它会从您的数组中删除一个键并 returns 它。
只要该数组有 keys 它就会循环直到它为空。
两者的区别是天壤之别:
示例 1 中的 for
循环。 将循环但不会改变您的原始数组。
在示例 2 中使用 shift()
。 你正在(使用和) 一个接一个地删除 你的数组键。
阅读有关数组操作的更多信息:
Array.prototype.shift1 <-- [2,3,4]
Array.prototype.unshift5 --> [5,2,3,4]
Array.prototype.push[5,2,3,4,6] <-- 6
Array.prototype.pop[5,2,3,4] --> 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
不需要索引吗?
您可以使用 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);
}
所以你基本上是在问 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()!!!
所以基本上它会从您的数组中删除一个键并 returns 它。
只要该数组有 keys 它就会循环直到它为空。
两者的区别是天壤之别:
示例 1 中的 for
循环。 将循环但不会改变您的原始数组。
在示例 2 中使用 shift()
。 你正在(使用和) 一个接一个地删除 你的数组键。
阅读有关数组操作的更多信息:
Array.prototype.shift1 <-- [2,3,4]
Array.prototype.unshift5 --> [5,2,3,4]
Array.prototype.push[5,2,3,4,6] <-- 6
Array.prototype.pop[5,2,3,4] --> 6
和其他方法