js实现重排
实现数组重排
使用Fisher-Yates洗牌算法对数组进行随机重排。该算法通过遍历数组并随机交换元素实现高效且均匀的随机排列。
function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
DOM元素重排
对DOM子元素进行随机排序可以通过以下方式实现。先转换为数组操作后再重新插入DOM。
function shuffleDOM(parent) {
const children = Array.from(parent.children);
shuffleArray(children);
children.forEach(child => parent.appendChild(child));
}
保留原数组的重排
创建数组副本进行重排,避免修改原数组。适用于需要保留原始数据的情况。
function shuffleCopy(array) {
const newArray = [...array];
return shuffleArray(newArray);
}
加权随机重排
当需要根据权重进行非均匀重排时,可以使用以下方法。权重越高出现概率越大。
function weightedShuffle(items, weights) {
const totalWeight = weights.reduce((a, b) => a + b, 0);
return items.map((_, i) => {
const rand = Math.random() * totalWeight;
let weightSum = 0;
for (let j = 0; j < items.length; j++) {
weightSum += weights[j];
if (rand <= weightSum) return items[j];
}
});
}
稳定重排
保持部分元素相对顺序的重排实现。通过分组先打乱组间顺序再打乱组内顺序。

function stableShuffle(array, groupSize) {
const groups = [];
for (let i = 0; i < array.length; i += groupSize) {
groups.push(array.slice(i, i + groupSize));
}
shuffleArray(groups);
return groups.flatMap(group => {
shuffleArray(group);
return group;
});
}






