我知道"如何在JavaScript中对数组进行洗牌已经存在问题了#34;但我没有找到一个关于如何以不可变的方式改组阵列的具体问题。那么,什么是在JavaScript中不可变地改组数组的最好方法呢?
也许从https://stackoverflow.com/a/2450976/3022127得到答案,只是先复制数组(在方法内部)是最好的方法?
也许是这样的:
const shuffleArray = (arr) => {
return arr
.map(a => [Math.random(), a])
.sort((a, b) => a[0] - b[0])
.map(a => a[1])
}
(似乎非常随机https://jsfiddle.net/Lpy22x4c/1/)
答案 0 :(得分:1)
首先复制数组,然后在适当位置进行随机播放很有意义,是的。
或者,可以轻松调整the question you linked中的实现以创建新数组,使旧数组保持不变。主要的变化是获取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;
}

答案 1 :(得分:-1)
只需使用此解决方案,但在进行改组之前设置一个等于数组的新变量:How can I shuffle an array?
所以它看起来像:
/**
* Shuffles array in place.
* @param {Array} a items An array containing the items.
*/
function shuffle(oldArray) {
var j, x, i;
var newArray = oldArray;
for (i = newArray.length - 1; i > 0; i--) {
j = Math.floor(Math.random() * (i + 1));
x = newArray[i];
newArray[i] = newArray[j];
newArray[j] = x;
}
return newArray;
}