纵观大厂的前端算法题,有难有易,下面就难度等级划分为几个类型供你们参考。前端
展开一个数组,数组最多二维:[[1,2],[3,4]] => [1,2,3,4]
算法
解答:主要考察spread运算符以及数组的concat用法。编程
function flatten(arr) { return [].concat(...arr); }
例1:展开一个数组(多维): [[1,2],3,[4,[5,6,[7,8]]]] => [1,2,3,4,5,6,7,8]
解答:考察递归的思想,其实递归是一种数学思想,把问题自己转化为可以用递归的形式表示的数学公式,那么再复杂的递归问题也能够迎刃而解。数组
function flatten(arr) { return [].concat( ...arr.map(e => { Array.isArray(e) ? flatten(e) : e; })); }
例2:写一个节流函数,使得用户滚动滚动条的时候每60ms才触发一次scroll事件
解答:利用“加锁”的思想。函数式编程
function throttle(func, delay = 30) { let lock = false; return (...args) => { if(lock) return; func(...args); lock = true; setTimeout(() => {lock = false}, delay); } } document.addEventListener("scroll", throttle(console.log("scrolling")));
例3: 写一个节流函数,使得用户输入中止后300ms才触发验证
解答:每来一次事件,都重启计数器。函数
function throttle(func, delay = 300, timeoutId = null) { return (...args) => { clearTimeout(timeoutId); timeoutId = setTimeout((...args) => func(...args), delay) } }
实现函数柯里化
解答:柯里化一般也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果。code
const curry = (func) => { const g = (...allArgs) => allArgs.length >= func.length ? func(...allArgs) : (...args) => g(...allArgs, ...args); return g; }