Копирование массива, а затем перетасовка на месте имеет смысл, да.
Альтернативно, реализация в вопрос, который вы связали , может быть легко скорректирована для создания нового массива, оставляя старый массив без изменений. Основным изменением является получение элемента для currentIndex
: мы хотим получить его из нового массива, если он есть в новом массиве, или старого массива, если нет.
function shuffle(array) {
var newArray = [];
var currentIndex = array.length, temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
if (newArray.hasOwnProperty(currentIndex)) {
temporaryValue = newArray[currentIndex];
} else {
temporaryValue = array[currentIndex];
}
newArray[currentIndex] = array[randomIndex];
newArray[randomIndex] = temporaryValue;
}
return newArray;
}
// Used like so
var arr = [2, 11, 37, 42];
console.log("shuffled", shuffle(arr));
console.log("original", arr);
.as-console-wrapper {
max-height: 100% !important;
}