Перемешать массив объектов не работает должным образом - PullRequest
0 голосов
/ 13 января 2019

Массив объектов Shuffle не работает должным образом

Я пробовал все виды методов случайного воспроизведения, которые я нашел здесь. Если я запускаю их на js.fiddle, все работает нормально, но, поскольку я использую его в своем коде, он больше не перемешивается. Там нет сообщения об ошибке или что-нибудь. Это просто ничего не делает. Я прочитал все темы здесь о перетасовке объектов, но я не нашел ничего, что решает эту проблему.

Я использую API из https://randomuser.me/ для получения случайных пользователей. Они хранятся в массиве объектов, которые я хочу перемешать, а затем визуализировать в пользовательском интерфейсе. У меня есть класс генератора для извлечения данных, и я храню все в объекте состояния. Мне интересно, может быть, это что-то связано с асинхронной функцией, потому что все это довольно ново для меня.

export const shuffle = (array) => {
    let currentIndex = array.length;
    let temporaryValue;
    let randomIndex;
    const newArray = array.slice();
    // While there remains elements to shuffle...
    while (currentIndex) {
        randomIndex = Math.floor(Math.random() * currentIndex);
        currentIndex -= 1;
        // Swap it with the current element.
        temporaryValue = newArray[currentIndex];
        newArray[currentIndex] = newArray[randomIndex];
        newArray[randomIndex] = temporaryValue;
    }
    return newArray;
};

А вот другой код, где я также вызываю функцию shuffle

/* Global state of the app

 */

const state = {};

const startGame = async() => {

    // 1) New Generator and add to state
    state.generator = new Generator();

    // 2) Prepare UI for Rendering
    renderer.clearContent();

    // 3)  Call API for new User
    await state.generator.generateUser();

    // 4) Render user to UI
    renderer.renderResults(state.generator.user);

    // 5) Start a timer
    $("#CountDownTimer").TimeCircles().start();


    // When Timer hits 0 -------------->

    $("#CountDownTimer").TimeCircles().addListener(function(unit, value, total) {
        if (total < 0) {
            //1) Clear HTML Content and Stop Timer
            elements.playGround.innerHTML = "";
            $("#CountDownTimer").TimeCircles().stop();
            //2) shuffle Person Object
            shuffle.shuffle(state.generator.user);
            console.log(state.generator.user)

            //3) Display Image  
        }
    });
}

timer.displayTimer();

elements.startButton.addEventListener('click', element => {
    element.preventDefault();
    startGame();
})

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Ваш метод shuffle является неизменным, и вы не используете его возвращаемое значение при вызове.

Удалить эту строку: const newArray = array.slice(); и замените newArray на array

0 голосов
/ 13 января 2019

Обратите внимание, что ваша shuffle функция возвращает массив new , но когда вы вызываете его в shuffle.shuffle(state.generator.user);, вы не присваиваете возвращаемое значение ничему ...

Попробуйте что-то вроде:

state.generator.user = shuffle.shuffle(state.generator.user);
...