縱觀大廠的前端算法題,有難有易,下面就難度等級劃分爲幾個類型供你們參考。前端
展開一個數組,數組最多二維:[[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; }