Получить четыре уникальных предмета и добавить их в массив - PullRequest
0 голосов
/ 03 ноября 2011

Я на 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

    }

По сути, в цикле для каждого элемента я проверяю, существует ли он уже в массиве или нет. Если это не так, поместите его в массив, иначе запустите цикл снова. Вот результат записи консоли:

enter image description here

Ну, во-первых, он всегда показывает конечное состояние массива: как будто он уже заполнен результатами, что странно. Но самое главное: скрипт не распознает дубликаты (например, в первом результате 74 повторяется, а во втором - 47).

Возвращает только что-то отличное от -1, когда находит совпадение во второй позиции (очевидно, возвращает 1). Когда совпадение находится в другой позиции в массиве, оно всегда возвращает -1.

Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2011

Вариант с алгоритмом перетасовки кажется лучшим вариантом здесь.

0 голосов
/ 03 ноября 2011

Вы тестируете это в IE6? Проблема в том, что indexOf не работает с IE6.

В качестве альтернативы вы можете проверить Лучший способ узнать, есть ли элемент в массиве JavaScript?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...