0%

算法知识

数组展平(递归)

展平一个数组,[[1,2],3,[[[4]],5]] => [1,2,3,4,5]

1
2
3
4
5
function flatten(arr){
return [].concat(
...arr.map(x => Array.isArray(x) ? flatten(x) : x)
)
}

函数节流

document.addEventListener(‘scroll’, throttle(console.log(‘滚动了’)))
过滤掉重复的滚动事件

1
2
3
4
5
6
7
8
9
function throttle(fn, delay = 60){
let lock = false
return (...args) => {
if(lock) return;
fn(...args);
lock = true;
setTimeout(() => {lock = false}, delay)
}
}

过滤掉重复的验证事件(用户输入停止后300ms触发验证)

1
2
3
4
5
6
7
function throttle(fn, delay, timer = null){
return (...args) => {
clearInterval(timer)
timer = setTimeout(fn.bind(null, ...args), delay)
// timer = setTimeout((...args) => fn(...args), delay)
}
}

柯里化

1
2
3
4
5
const curry = func => {
const g = (...allArgs) => allArgs.length >= func.length ?
func(...allArgs) : (...args) => g(...allArgs, ...args);
return g;
}

重要的Math函数

1
2
3
4
5
6
7
8
9
Math.abs 求绝对值
Math.ceil 向上取整
Math.floor 向下取整
Math.max 求最大值
Math.min 求最小值
Math.random 0~1之间的随机数
Math.sqrt 平方根
Math.sign 求数值的符号
Math.pow 求幂

分页计算

在一个分页表格中,给定每页显示条数(pageSize)和元素的序号(index),求页码

1
const pageNo = Math.ceil((index+1)/pageSize)

数组最大值

const A = [1,2,3,4,5]

1
const max = Math.max(...A)

生成20~30的随机数

const min = 20, max = 30;

1
Math.round(min + Math.random() * (max-min))

判断一个数是否时素数

1
2
3
4
5
6
7
8
9
10
11
12
function is_prime(n){
if(n <= 1) return;
const N = Math.floor(Math.sqrt(n));
let is_prime = true;
for(let i = 2; i <= N; i++){
if(n % i === 0){
is_prime = false
break;
}
}
return is_prime
}

数组相关操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Array.length 长度  [1,2,3].length -> 3
indexOf 获取元素的序号 [1,2,3].indexOf(2) -> 2
Array.isArray 判断是否是数组 Array.isArray([]) -> true
forEach 遍历
push/pop/shift/unshift 入栈、出栈、入队、出队
map 映射-11 [1,2,3].map(x => x*2) -> [2,4,6]
reduce 聚合-多对1 [1,2,3].map((x, y) => x+y) -> 6
filter 筛选 [1,2,3].filter(x => x > 2) -> [3]
Array.from 创建数组
concat 合并数组 [1,2].concat([3,4]) -> [1,2,3,4]
slice 剪切
splice 删除/插入/替换
reduceRight 从右到左reduce
sort 排序
every 所有元素符合某个条件 [1,2,3].every(x => x>0) -> true