Я на 100% уверен, что этот код работал раньше. Теперь, как ни странно, это не так.
Цель состоит в том, чтобы создать тест с несколькими вариантами ответов для карточки. Я создаю массив для хранения идентификаторов карты: сначала идет идентификатор текущей карты, затем три других случайных. Моя цель - убедиться, что они не повторяют ни первую карту, ни себя.
Вот как я это делаю:
// Array of cards’ ids to use
var randomCardsIds = [];
// Get the active card’s element id, add it to the array
randomCardsIds[0] = this.activeCardId;
// Get the current cards collection
var allCurrentCards = this.carouselEl.items.items;
// Get three random ids of other cards
var i = 0
while (i<3) {
// Get a random card element
var randomCardEl = allCurrentCards[Math.floor(Math.random() * allCurrentCards.length)];
// Get its id
var randomCardElId = randomCardEl.body.down('.card').id;
randomCardElId = randomCardElId.substring(randomCardElId.indexOf('_')+1);
console.log(randomCardElId, randomCardsIds, randomCardsIds.indexOf(randomCardElId));
// Make sure it is not in the array yet, and then add it
if (randomCardsIds.indexOf(randomCardElId) == -1) {
randomCardsIds.push(randomCardElId);
i++;
}
// Otherwise, the loop will have to run again
}
По сути, в цикле для каждого элемента я проверяю, существует ли он уже в массиве или нет. Если это не так, поместите его в массив, иначе запустите цикл снова. Вот результат записи консоли:

Ну, во-первых, он всегда показывает конечное состояние массива: как будто он уже заполнен результатами, что странно. Но самое главное: скрипт не распознает дубликаты (например, в первом результате 74 повторяется, а во втором - 47).
Возвращает только что-то отличное от -1, когда находит совпадение во второй позиции (очевидно, возвращает 1). Когда совпадение находится в другой позиции в массиве, оно всегда возвращает -1.
Что я здесь не так делаю?