Как сохранить старое состояние массива перед перетасовкой
У меня есть массив из 50 объектов в качестве элементов.
Каждый объект содержит массив из 4 элементов:
var all = [{
question: "question 1 goes here",
options: ["A", "B", "C", "D"]
}, ... {
question: "question 50",
options: ["A", "B", "C", "D"]
}]
Я хочу выбрать 10 элементов случайным образом и сохранить в двух других массивах, один из которых я хочу перемешать. но при перетасовке затрагиваются оба массива.
var selected = [];
var shuffled = [];
for(let i = 0; i < 10; i++) {
let rand = Math.floor(Math.random() * all.length);
selected.push(all[rand]);
shuffled.push(all[rand]);
all.splice(rand, 1);
for(let j = 3; j > 0; j--) {
let rand2 = Math.floor(Math.random() * j);
[
shuffled[i].options[j],
shuffled[i].options[rand2]
] = [
shuffled[i].options[rand2],
shuffled[i].options[j]
];
}
}
console.log(selected); // is shuffled too
console.log(shuffled);
Как мне это предотвратить?
Я чувствую, что упускаю что-то довольно простое, но не могу этого заметить.
2 ответа
Вам необходимо создать новые экземпляры для выбранных объектов и их массивов:
Я выделил алгоритм перемешивания в отдельную функцию () и применил его дважды: сначала к
all
массив, чтобы убедиться, что мы не получаем дубликатов в нашем "случайном" выборе, а затем в
options
массивы, содержащиеся в их отрезанных объектах. Функция сортирует массив на месте. Я заставил его снова возвращать ссылку на массив исключительно для удобства, так как это помогает мне сохранять мой код более компактным. Обратите внимание, что в моем
shuffle()
вызовы Я уже создал новые экземпляры массива в его списке аргументов, применив
...
оператор.
Попробуйте использовать функцию распространения, которая делает бумажную копию вашего объекта
all