Перемешать списки в структурах, вложенных в другой список - PullRequest
0 голосов
/ 11 ноября 2018

С помощью следующего кода:

[
  %Quizz{
    question: "L'unità d' Italia",
    answers: [
      %{answer: 1900, result: false},
      %{answer: 1861, result: true},
      %{answer: 1848, result: false},
    ]
  },
  %Quizz{
    question: "La Rivoluzione Francese",
    answers: [
      %{answer: 1789, result: true},
      %{answer: 1818, result: false},
      %{answer: 1766, result: false},
    ]
  },
  %Quizz{
    question: "La scoperta dell'America",
    answers: [
      %{answer: 1280, result: false},
      %{answer: 1500, result: false},
      %{answer: 1492, result: true},
    ]
  }
]

Я бы хотел перемешать 3 структуры викторины, используя Enum.shuffle, и перемешать список ответов для каждой структуры.Я могу перетасовать список, но я пытаюсь обновить список ответов для каждой структуры.Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Вы также можете использовать Map.update!/3 или Kernel.update_in/3:

quiz_list
|> Enum.shuffle
|> Enum.map(fn q -> Map.update!(q, :answers, &Enum.shuffle/1) end)
0 голосов
/ 12 ноября 2018

Я бы пошел с Kernel.SpecialForms.for/1 пониманием:

for quizz <- Enum.shuffle(quizzes),
  do: %Quizz{quizz | answers: Enum.shuffle(quizz.answers)}

или наоборот:

for quizz <- Enum.shuffle(quizzes),
    answers = Enum.shuffle(quizz.answers),
  do: %Quizz{quizz | answers: answers}
0 голосов
/ 11 ноября 2018

Вы можете перетасовать список, а затем отобразить его, заменив каждое поле answers на его перемешанную версию

Enum.shuffle(list_of_quizzes)
|> Enum.map(fn(%{answers: answers} = quizz) -> 
    %{quizz | answers: Enum.shuffle(answers)}
end)
...