Как сохранить старое состояние массива перед перетасовкой

У меня есть массив из 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

Другие вопросы по тегам