「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」
Javascript 实现数组乱序
一、题意
实现一个类,可以打乱一个没有重复元素的数组。 要求实现的功能:
- reset方法:返回初始时传入的原始数组。
- shuffle方法:随机打乱数组。
二、解法
1. 方法一:随机数组下标
思路:
reset 函数:缓存传入的原始数据,用于在函数调用时返回。
shuffle 函数:模仿从盒子里取小球。具体的操作,可以把原始数组复制一份为 nums,每次根据 nums 的长度随机生成一个下标从 nums 中取一个 数出来,将其放入新数组 arr 中,并删除 nums 中对应下标的数。下次从新的数组中取数。
具体实现:
- 定义 nums 存储传入的数据
- 定义 original 存储 nums 的克隆数组
- 定义 reset 方法,将 nums 重新赋值为 this.original 的克隆数组,并将 this.original 重新克隆一遍
- 定义 shuffle 方法,根据 this.nums 的长度进行循环,每次从根据 this.nums 长度 通过 Math.random() 随机生成一个下标
- 根据随机生成的下标,将值存入 arr 数组中
- 返回 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 到当前遍历下标之间的随机整数,和当前遍历下标的元素进行互换。这跟方法一中的模拟摸球是一样的,每次被摸出的球便不能再被摸出来,只是把被摸出来的球放在数组的后面部分。
具体实现:
- 定义 nums 存储传入的数据
- 定义 original 存储 nums 的克隆数组
- 定义 reset 方法,定义 reset 方法,将 nums 重新赋值为 this.original 的克隆数组,并将 this.original 重新克隆一遍。
- 定义shuffle 方法,根据 this.nums 的长度进行倒序循环,每次从当前下标 i 随机生成一个下标
- 根据随机生成的下标,和当前下标进行数据互换,直到遍历完整个数组。
- 返回 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;
};
}