Przypsianie kilku zmiennym wartości z tablicy

1
  1. Chciałbym zapytać, czy ten kod ma jakiś cel obecnie?

    let arrAnswerVaranty = ['a', 'b', 'c', 'd'];

    Jeśli nie ma, to ja bym go usunął, żeby nie robić bałaganu. Później można go zawsze dodać.

  2. Myślę, że jeszcze jedna funkcja się nada. Od razu ją zaimplementujmy. Będzie ona podobna w założeniu do getRandomAnswers – będzie losować pytanie i je zwracać. Wiem, że już podobna była, ale napiszmy ją od początku, żeby wszystko było jasne.
    2.1. Niech nazywa się getRandomQuestion.
    2.2. Nie powinna mieć parametrów.
    2.3. Umieść w niej następujący kod. To nie jest nowy kod, już go wcześniej pisałeś. Zrobiłem tylko dwie zmiany: zmieniłem nazwę zmiennej randomQuestIndex na currentRandomIndex, żeby była bardziej intuicyjna, oraz przeniosłem deklarację tej zmiennej przed pętlę, żeby działanie kodu było bardziej intuicyjne:

    var currentRandomIndex;
    do {
      currentRandomIndex = Math.floor(Math.random() * questArr.length);
    } while (currentRandomIndex === randomIndex);
    randomIndex = currentRandomIndex;

    2.4. Dodatkowo niech ta funkcja zwraca element tablicy questArr o indeksie currentRandomIndex.

0

A tą zmienną jslet oldQuestionIndex = -1; usunąć czy zmieniłeś jej nazwe na var currentIndex bez żadnej wartości?

0

To jest mój dotychczasowy kod https://jsfiddle.net/8hn2m4vz/. Nie jestem tylko pewien co do zmiennej js let oldQuestionIndex = -1 ponieważ nie wiem czy ją usunąłeś czy zmieniłeś jej nazwe?

1

Trochę się nie zrozumieliśmy. :)

  1. Sama zmienna currentRandomIndex nie jest nowa. Nazywała się tylko inaczej – randomQuestIndex. Ponadto w kodzie była deklaracja tej zmiennej wraz z inicjalizacją (w jednej linijce), a ja te dwie rzeczy rozdzieliłem. Stąd pojawiła się w kodzie ode mnie instrukcja var currentRandomIndex; – i powinieneś ją umieścić w funkcji getRandomQuestion, tak samo jak pętlę (a nie poza funkcją).
  2. Instrukcja let oldQuestionIndex = -1; powinna zostać na swoim miejscu, tak, jak była.
  3. Funkcja showRandomQuestion powinna zostać na swoim miejscu, tak, jak była (a widzę, że ją usunąłeś).
  4. Funkcja getRandomQuestion to powinna być nowa funkcja.
0

Czy teraz jest ok https://jsfiddle.net/74vj3ckf/?

1

Jeszcze nie do końca: w funkcji getRandomQuestion masz dwie zmienne, randomQuestIndex oraz currentRandomIndex. Chodzi o to, żeby była tylko jedna – currentRandomIndex. Powinieneś więc zamienić linijkę

var randomQuestIndex = Math.floor(Math.random() * answers.length);

na

currentRandomIndex = Math.floor(Math.random() * answers.length);
0

Brakuje jeszcze zwracania przez funkcję getRandomQuestion elementu tablicy questArr o indeksie currentRandomIndex. Zauważ, że nazwa funkcji zaczyna się na get, a to sugeruje, że powinna ona coś zwracać.

I jak to już zrobisz, to dalej zaimplementujmy funkcję showRandomQuestion:

  1. Wywołaj w niej funkcję getRandomQuestion i zapisz wynik tego wywołania do zmiennej (sam wymyśl nazwę; postaraj się, żeby była w miarę opisowa).
  2. Przypisz tę nowo utworzoną zmienną do właściwości innerHTML obiektu headerQuestion.
0
  1. Błąd – linijka:

    currentRandomIndex = Math.floor(Math.random() * answers.length);

    powinna wyglądać tak:

    currentRandomIndex = Math.floor(Math.random() * quizArr.length);
  2. Zapomniałem o jednej rzeczy w funkcji getRandomQuestion. Nie powinna ona zwracać "obiektu pytania" (bo nie ma to sensu dla jej obecnego przeznaczenia), tylko samo pytanie (ciąg znaków). Dlatego trzeba linjkę:

    return quizArr[currentRandomIndex];

    zamienić na:

    return quizArr[currentRandomIndex].question;
  3. Literówka: instrukcję showRandomQuestions(); zamień na showRandomQuestion();

  4. Widzisz teraz pytanie po uruchomieniu kodu. :) Zmienia się ono na inne i losowe po naciśnięciu przycisku "Wyślij".


Przejdźmy od razu do implementowania funkcji getRandomVariants. Nie znalazłem kodu w tym wątku, który by odpowiadał dokładnie temu, co trzeba zrobić, więc od początku napiszemy:

  1. Funkcja powinna mieć jeden parametr – indeks "obiektu pytania".
  2. Losowanie odpowiedzi można zrobić na co najmniej dwa sposoby: 1) poprzez skopiowanie tablicy z odpowiedziami z obiektu pytania o podanym indeksie i w miarę losowania kolejnych odpowiedzi usuwanie z tej skopiowanej tablicy wylosowanych już odpowiedzi; 2) poprzez stworzenie pustej tablicy i w miarę losowania kolejnych odpowiedzi dodawanie ich do niej. Moim zdaniem lepiej wybrać wariant nr 2, bo jest mniej podatny na błędy (nie wiem, czy potrzebujesz uzasadnienie). Algorytm powinien przebiegać tak:
    2.1. Tworzysz pustą tablicę answersIndices.
    2.2. Dla każdej odpowiedzi pytania o danym indeksie: (2.2.1.) losujesz indeks odpowiedzi dotąd, aż nie będzie on już obecny w tablicy answersIndices; (2.2.2.) dodajesz ten indeks do tablicy answersIndices.
  3. Funkcja powinna zwracać tablicę answersIndices.

Zamieszczę tu kod całej funkcji, bo zdaję sobie sprawę, że powyższy algorytm jest niezbyt czytelny. Jak czegoś nie rozumiesz, pytaj:

function getRandomVariants(id) { // Punkt 1
    const answersIndices = []; // Punkt 2.1
    for (const a of quizArr[id].answers) { // Cała pętla for to punkt 2.2
        let r = -1;
        do {
            r = Math.floor(Math.random() * quizArr[id].answers.length);
        } while (answersIndices.includes(r)); // Cała pętla do-while to punkt 2.2.1
        answersIndices.push(r); // Punkt 2.2.2
    }
    return answersIndices; // Punkt 3
}

Warto wspomnieć, że funkcja getRandomVariants zwraca tablicę indeksów, a więc trochę nienajlepiej odpowiada to jej nazwie. Ja jestem zdania, że ważniejsza jest spójność kodu niż intuicyjność, więc na razie nie będziemy tego ruszać. Po skończeniu całości możemy się zastanowić nad zmianą nazw.

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: CCBot