Open
Description
题目
- 实现随机抽奖程序 接受一个数组 arr, n , 从数组中抽出n个人
- 实现 sleep(5).then(console.log), sleep(4), sleep(5).then(console.log); 执行.then的时候才输出,执行sleep函数的时候不输出
- 实现一个发布订阅模式和观察者模式
- 斐波那契数列
- 不使用新的变量交换两个变量的值
- 实现一个Promise.all
- 手写call/apply/bind
- 手写函数防抖和节流
- 实现一个 iterator
- 实现一个 async函数(gernerator + promise版本)
- 实现一个 new
- 手写两列布局和三列布局(你知道的所有)
答案
- 实现随机抽奖程序 接受一个数组 arr, n , 从数组中抽出n个人
代码一:
按照我们正常的抽奖的最简单做法,一般是把工号写到一个球上面,摇 n 次,然后每次摇出1个号,该号码即为中奖号码,同时将该球拿出去,重复 n 次。
function foo(arr, n) {
const result = [];
let i = 0;
while( i < n) {
// 每次从数组中随机抽出一个值,使用 slice将该值从原数组数组中删除,将该值添加到 result中
const value = arr.splice(Math.floor(Math.random() * arr.length), 1)
result.push(value[0]);
i++;
}
return result;
}
代码二:
还有一种思路是将数组打乱,直接截取 前 n 个数。就是著名的 洗牌算法。
打乱数组(洗牌算法):从最后一个元素开始,从数组中随机选出一个位置,交换,直到第一个元素。
function disorder(array) {
const length = array.length;
let current = length - 1;
let random;
while(current > -1) {
random = Math.floor(length * Math.random());
// 数组的每个值都会和另外一个随机位置的值交换位置
// 使用数组的解构赋值,交换数组中的两个元素的位置
[array[current], array[random]] = [array[random], array[current]];
current--;
}
return array;
}
const arr1 = disorder(arr);
arr1.slice(0, n)
具体的可以查看下面几篇文章
- 实现 sleep(5).then(console.log), sleep(4), sleep(5).then(console.log); 执行.then的时候才输出,执行sleep函数的时候不输出
let count = 0;
function sleep(s) {
count += s;
return {
then: () => {
setTimeout(() => console.log(s), count * 1000)
}
}
}
sleep(3).then();
sleep(4);
sleep(5).then();
- 实现一个发布订阅模式和观察者模式