Вы можете использовать оператор запятой для объявления нескольких переменных и выполнения нескольких операторов в одном цикле for
.
В вашем случае вы можете сделать что-то вроде:
for(var CatAIndex = 0, CatBIndex = 0; CatAIndex+CatBIndex < numrounds; incrementA ? CatAIndex++ : CatBIndex++) {
// Insert your code here
}
Я выбрал эти подробные имена переменных, чтобы сделать их более понятными. У вас будет два отдельных индекса для категорий A и B, и вы сравните сумму двух с количеством раундов, которые вы хотите запустить. Затем внутри своего цикла for
вы устанавливаете логическое значение incrementA
либо true
, либо false
, чтобы указать, какой из них увеличить.
Это примерно соответствует тому, что вы просите, но я думаю, что вы бы предпочли использовать комбинацию Math.random
, <array>.splice
и <array>.length
, чтобы получить случайное слово / неслово из каждого списка, скорее чем производить предсказуемый порядок выбора. Тогда вам даже не нужно заботиться , каковы индексы для этих двух категорий, и вы можете вернуться к простому типу цикла for(var i = 0; i < numrounds; i++)
.
Если последнее действительно то, что вам нужно, оставьте комментарий к этому ответу, и я обновлю его другим примером.
EDIT:
Хорошо, я предполагаю, что фактическое количество и порядок слов и неслов на самом деле не определены вашим тестом, потому что в противном случае пользователь мог бы подобрать шаблон слова / неслова и рождественскую елку. Я также предполагаю, что у вас есть два массива слов и не-слов с именами catA
и catB
в глобальной области видимости. Ниже приведена функция, которая будет выполнять следующие действия:
- Случайно выбрать слово или не слово.
- Никогда не повторяйте выбор слова или неслова (это означает, что технически он становится более детерминированным, чем ближе к концу списка вы находитесь.
- Пока все слова не будут исчерпаны, в этот момент он автоматически "обновит" свой список из массивов
catA
и catB
. (Так что вы можете установить numrounds
на +inf
, если хотите.)
.
var pickAWord = (function outerScope() {
var allWords = [];
return function innerClosure() {
if(allWords.length == 0) {
allWords = [].concat(catA, catB);
}
return allWords.splice(Math.floor(Math.random()*allWords.length), 1)[0];
};
})();
Функция использует концепцию замыканий функционального программирования для создания постоянной «глобальной» переменной allWords
, которую может видеть только она. Функция автоматически обновляет массив со всеми словами, когда длина массива достигает нуля (как и в начале), используя глобалы catA
и catB
. Чтобы использовать его в цикле for, просто:
for(var i = 0; i < numrounds; i++) {
var wordToUse = pickAWord();
// Do something
}
Если вам нужно гарантировать, что используется одинаковое количество слов catA
и catB
, функция outerScope
должна будет отслеживать три переменные: копии catA
и catB
и массив такого же размера, как numrounds
, половина из которых true
и половина false
. splice
случайным образом из этого массива true / false, а затем случайным образом сращивается из catA
или catB
в зависимости от того, true
или false
. Тогда вам понадобится код, чтобы «обновить» все эти переменные замыкания, но он по сути будет таким же, как написано выше.
Извините, если функция немного сложна, но вы видите, как легко ее использовать, верно? :)