export function createRandomPicker(arr) { arr = [...arr]; // copy 数组,以免修改原始数据 function randomPick() { const len = arr.length - 1; const index = randomInt(0, len); const picked = arr[index]; [arr[index], arr[len]] = [arr[len], arr[index]]; return picked; } randomPick(); // 抛弃第一次选择结果 return randomPick; }
时间: 2024-03-31 17:32:05 浏览: 74
JS数组降维–Array.prototype.concat.apply([], arr)
这是一个使用闭包实现的生成随机选择器的函数。它的作用是接受一个数组作为参数,返回一个函数,每次调用该函数都会从数组中随机选择一个元素并返回,并且选择的元素不会重复出现,直到所有元素都被选择完毕。
函数的实现过程如下:
1. 将输入数组复制一份,以免修改原始数据。
2. 定义一个内部函数 `randomPick()`,每次调用该函数都会从数组中随机选择一个元素并返回。
3. 在 `randomPick()` 函数内部,通过 `randomInt()` 函数生成一个介于 0 和数组长度之间的随机整数,作为要选择的元素的下标。
4. 通过数组的解构赋值语法 `[arr[index], arr[len]] = [arr[len], arr[index]]`,将要选择的元素与数组的最后一个元素交换位置,以确保选择的元素不会重复出现。
5. 返回选择的元素。
6. 在函数的最后一行调用 `randomPick()` 函数一次,抛弃第一次的选择结果,以确保每次选择的元素都不同。
7. 返回 `randomPick` 函数,它是一个闭包,可以访问外部函数的变量和函数,保证每次调用 `randomPick` 函数都能选择不同的元素,直到所有元素都被选择完毕。
阅读全文