#javascript #for-loop #recursion
#javascript #for-цикл #рекурсия
Вопрос:
У меня есть цикл for, и я хотел бы преобразовать его в рекурсивную функцию.
У меня есть приглашение, которое должно появляться для каждого элемента и быть отклонено перед переходом к следующему элементу в списке. Такое поведение, похоже, не работает с обычным циклом for . Цикл завершается еще до отображения приглашения, а затем отображается только одно приглашение, даже если в списке есть более одного элемента, для которого должно было быть отображено приглашение.
(Я не совсем уверен, будет ли это работать с рекурсивной функцией, но из того, что я прочитал, это кажется многообещающим. Если я ошибаюсь в этом, то нет смысла делать преобразование.)
Я рассматривал другие примеры, но, похоже, никак не могу взять в толк, как именно они работают.
Вот мой оригинальный цикл:
for(var i = 0;i < items.get_count();i ) {
var item = items.getItemAtIndex(i);
//Is the item we're looking at in need of approval?
if (item.get_item("_ModerationStatus") === 2)
{
//Yes, prompt for approval. (code for prompt goes here.)
//Wait until prompt has received a response before going on next list item.
}
else
{
//No, do nothing.
}
}
Моя попытка выглядит немного грустной. Я не совсем уверен, куда идти дальше:
function recursiveCheckRequests(i)
{
if (i < items.get_count())
{
function checkRequest(items, )
//???
}
}
recursiveCheckRequests(0);
Комментарии:
1.
item.get_item("_ModerationStatus")
Возможно, ваше значение само по себе не является целым числом. Попробуйте вместо этого проверить== 2
или=== "2"
2. Верхний блок кода работает нормально. (Когда я помещаю поля с предупреждениями в обработчики
if
инструкции, поля отображаются, как и ожидалось.) Так что я не думаю, что это проблема.3. Похоже, что рекурсивная версия не решает проблему, связанную с тем, что всплывающее приглашение не работает должным образом, поэтому мне придется найти альтернативное решение для этого.
Ответ №1:
Вы должны вызвать функцию изнутри самой себя.
function recursiveCheckRequests(i) {
var item = items.getItemAtIndex(i);
//Is the item we're looking at in need of approval?
if (item.get_item("_ModerationStatus") === 2) {
//Yes, prompt for approval. (code for prompt goes here.)
//Wait until prompt has received a response before going on next list item.
}
if (i 1 < items.get_count()) {
recursiveCheckRequests(i 1);
}
}
recursiveCheckRequests(0);
Комментарии:
1. Ах да, это работает отлично. Он продолжает вызывать себя, если все еще есть элементы, и завершает работу, если их нет. Рекурсия все еще немного сбивает с толку, но для меня имеет смысл, почему это работает!
Ответ №2:
это то, что я бы сделал
function recursiveCheckRequests(pos,arr,length)
{
if (pos === length){
return true;
}
//do something here with the array
return recursiveCheckRequests(pos 1,length)
}
recursiveCheckRequests(0,array,array.length);
таким образом, функция полностью независима от передаваемого массива, и вы можете указать ограничение на количество итераций для выполнения.