当前位置:首页 > JavaScript

js实现重排

2026-02-02 09:28:28JavaScript

实现数组重排

使用Array.prototype.sort()方法结合随机数生成器实现数组元素的随机重排。这种方法通过比较函数返回随机正负值打乱原有顺序。

function shuffleArray(array) {
  return array.sort(() => Math.random() - 0.5);
}

Fisher-Yates洗牌算法

经典的Fisher-Yates算法通过逆向遍历数组并随机交换元素实现高效重排,时间复杂度为O(n)。这是目前最推荐的标准实现方式。

function fisherYatesShuffle(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;
}

使用ES6特性简化

利用扩展运算符和箭头函数可以写出更简洁的现代JavaScript实现:

const modernShuffle = arr => 
  [...arr].reduceRight((res, _, i, a) => 
    (res.push(a.splice(Math.floor(Math.random() * (i + 1)), 1)[0]), res), []);

性能优化版本

对于大型数组,使用位运算和类型化数组可以提升性能:

function optimizedShuffle(array) {
  const typedArray = new Uint32Array(array.length);
  crypto.getRandomValues(typedArray);

  return array.reduce((shuffled, _, i) => {
    const j = typedArray[i] % (i + 1);
    if (j !== i) [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
    return shuffled;
  }, [...array]);
}

不可变重排实现

保持原数组不变的情况下返回新数组:

js实现重排

const immutableShuffle = arr => {
  const copy = [...arr];
  for (let i = copy.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [copy[i], copy[j]] = [copy[j], copy[i]];
  }
  return copy;
};

标签: js
分享给朋友:

相关文章

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…