Для цикла, запускаемого только один раз для аргументов массива - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь создать базовый цикл for, который будет перебирать аргументы функции. Может быть переменное количество аргументов, поэтому я использую встроенный объект «аргументы» для этой цели. Однако цикл for, вложенный в функцию, кажется, останавливается после первого индекса аргументов.

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

  function tickets(){

  var change = 0;

  for(var j = 0;j < arguments.length; j++) {
    if (arguments[j] == 25) {
     return(change + 1);
   }
    else if(arguments[j] == 50) {
      return(change - 1);
    }
    else {
      return(change - 3);
    }
  }
}

console.log(tickets(25, 25 ,50, 25, 100))

Я ожидаю, что вышеприведенный код войдет в систему:

1 1 -1 1 -3

но вместо этого он просто возвращает 1, или что бы я ни изменил первое значение в списке аргументов. Это кажется очень простым, но я почесал голову - есть идеи?

Ответы [ 4 ]

0 голосов
/ 10 июля 2019

Ваша функция не ожидает никаких аргументов.Вам необходимо добавить параметр в объявление функции.Это как заполнитель для аргумента (ов), который вы хотели бы, чтобы функция принимала и имела дело с.В этом случае: функция tickets (arguments) {}

Я бы предложил использовать массивы как для списка аргументов, так и для списка результатов.Таким образом, вызов функции будет следующим: tickets ([25,25,50,25,100])

Как и предполагали другие люди, вы можете использовать array.map (), array.reduce () или forEach ().

Если цикл for по какой-либо причине является обязательным, это возможный ответ:

function tickets(arguments) {
  var result = [];

  for (var j = 0; j < arguments.length; j++) {
    var change = 0;
    if (arguments[j] == 25) {
      result.push(change + 1);
    } else if (arguments[j] == 50) {
      result.push(change - 1);
    } else {
      result.push(change - 3);
    }
  }
  return result;
}

console.log(tickets([25, 25, 50, 25, 100]));
0 голосов
/ 10 июля 2019

Ну, функция останавливается, когда она достигает первого возврата, вы должны добавить все результаты в массив и вернуть массив после окончания цикла

 function tickets(){

  var change = 0;
  var responses = [];

  for(var j = 0;j < arguments.length; j++) {
    if (arguments[j] == 25) {
     responses.push((change + 1));
   }
    else if(arguments[j] == 50) {
      responses.push((change - 1));
    }
    else {
      responses.push((change - 3));
    }
  }

  return responses;
}

console.log(tickets(25, 25 ,50, 25, 100))
0 голосов
/ 10 июля 2019

Поскольку вы используете return, вся функция завершается без движения вперед.Есть много способов справиться с этой ситуацией - одно вместо того, чтобы вернуть, сохранить результаты и вернуться в конце, как объяснил Мамун в ответе, или, если вы хотите сделать что-то в моде, вы пытаетесь использовать map для того же

function tickets(){
  var change = 0;

  return Array.from(arguments).map((d,j) => {
    if (arguments[j] == 25) {
     return(change + 1);
   }
    else if(arguments[j] == 50) {
      return(change - 1);
    }
    else {
      return(change - 3);
    }
  })
}

console.log(tickets(25, 25 ,50, 25, 100))
0 голосов
/ 10 июля 2019

return выполнение функции выхода. В вашем случае меняйте каждые return на console.log

...