Javascript 实现数组乱序

901 阅读1分钟

「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战

Javascript 实现数组乱序

一、题意

实现一个类,可以打乱一个没有重复元素的数组。 要求实现的功能:

  1. reset方法:返回初始时传入的原始数组。
  2. shuffle方法:随机打乱数组。

二、解法

1. 方法一:随机数组下标

思路
reset 函数:缓存传入的原始数据,用于在函数调用时返回。
shuffle 函数:模仿从盒子里取小球。具体的操作,可以把原始数组复制一份为 nums,每次根据 nums 的长度随机生成一个下标从 nums 中取一个 数出来,将其放入新数组 arr 中,并删除 nums 中对应下标的数。下次从新的数组中取数。

具体实现

  1. 定义 nums 存储传入的数据
  2. 定义 original 存储 nums 的克隆数组
  3. 定义 reset 方法,将 nums 重新赋值为 this.original 的克隆数组,并将 this.original 重新克隆一遍
  4. 定义 shuffle 方法,根据 this.nums 的长度进行循环,每次从根据 this.nums 长度 通过 Math.random() 随机生成一个下标
  5. 根据随机生成的下标,将值存入 arr 数组中
  6. 返回 arr 数组

代码

class arrayPlus {
    constructor(nums) {
        this.nums = nums;
        this.original = [...nums];
    }
    
    reset() {
        this.nums = this.original;
        this.original = [original];
        return this.original;
    };
    shuffle() {
        const arr = [];
        const nums = this.nums.slice(0);
        const len = nums.length;
        for (let i = 0; i < len; i++) {
            const index = Math.floor(Math.random() * nums.length);
            arr[i] = nums[index];
            nums.splice(index, 1);
        }
        return arr;
    };
}

1. 方法二:交换数组元素

思路
reset 函数:和方法一一样
shuffle 函数:模仿从盒子里取小球。具体的操作,从数组的最后往前迭代,生成一个范围在 0 到当前遍历下标之间的随机整数,和当前遍历下标的元素进行互换。这跟方法一中的模拟摸球是一样的,每次被摸出的球便不能再被摸出来,只是把被摸出来的球放在数组的后面部分。

具体实现

  1. 定义 nums 存储传入的数据
  2. 定义 original 存储 nums 的克隆数组
  3. 定义 reset 方法,定义 reset 方法,将 nums 重新赋值为 this.original 的克隆数组,并将 this.original 重新克隆一遍。
  4. 定义shuffle 方法,根据 this.nums 的长度进行倒序循环,每次从当前下标 i 随机生成一个下标
  5. 根据随机生成的下标,和当前下标进行数据互换,直到遍历完整个数组。
  6. 返回 nums 数组

代码

class arrayPlus {
    constructor(nums) {
        this.nums = nums;
        this.original = [...nums];
    }

    reset() {
        this.nums = this.original;
        this.original = [original];
        return this.original;
    };
    shuffle() {
        const nums = this.nums.slice(0);
        const len = nums.length;
        for (let i = len - 1; i > 0; i -= 1) {
            const targetIndex = Math.floor(Math.random() * (i + 1));
            const tmp = nums[i];
            nums[i] = nums[targetIndex];
            nums[targetIndex] = tmp;
        }
        return nums;
    };
}