JavaScript - для циклического и массивного сдвига

У меня есть две функции, они выглядят одинаково, но я не совсем понимаю, когда внутри 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; }
];

Я пытаюсь перебрать массив с входом. Результат первой функции будет затем использован как входная функция следующей функции, после чего будет удален первый массив.

Это то, что я написал...

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 нужен индекс?

2 ответа

Решение

Итак, вы в основном спрашиваете, что 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()!!!

Так что в основном он удаляет ключ из вашего массива и возвращает его.
Пока этот массив имеет ключи, он будет зацикливаться, пока не станет пустым.

Разница между этими двумя резко:
for цикл в примере 1. зациклит, но не изменит ваш исходный массив.
С помощью shift() в примере 2. вы (используете и) удаляете свои ключи Array один за другим.

Узнайте больше о манипулировании массивом:

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

и другие методы

Вы можете упростить логику, используя 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);
}
Другие вопросы по тегам