1、防抖和节流函数 防抖的主要思想是,当事件被触发后,延迟一定时间再执行相关操作。如果在这个延迟期内再次触发了同样的事件,就会重新计时。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 const debounce = function (fn, delay ) { let timer = null ; return function ( ) { const that = this ; if (timer){ clearTimeout(timer); timer = null ; } timer = setTimeout(function ( ) { fn.apply(that, arguments ); }, delay) } } window .addEventListener('resize' , debounce(() => { console .log('防抖执行' ); }, 300 ));
节流的主要思想是,在一定时间内只允许函数执行一次,无论事件触发了多少次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 const throttle = function (fn, delay ) { let lastTime = 0 ; return function ( ) { const now = Date .now(); if (now - lastTime > delay){ fn.apply(this , arguments ); lastTime = now; } } } window .addEventListener('scroll' , throttle(() => { console .log('节流执行' ); }, 300 ));
2、实现bind方法 bind() 方法会创建一个新函数。当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this,之后的一序列参数将会在传递的实参前传入作为它的参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 const obj = { name: 'zc' , age: 12 } function say (sex ) { console .log(`name: ${this .name} , age: ${this .age} , sex: ${sex} , 参数: ${[...arguments ]} ` ); } const mySay = say.bind(obj, 'female' );mySay(111 ); Function .prototype.myBind = function (context ) { const that = this ; const args = Array .prototype.slice.call(arguments , 1 ); return function ( ) { const newArgs = Array .prototype.slice.call(arguments ); return that.apply(context, [...args, ...newArgs]); } } const mySay1 = say.myBind(obj, 'female' );mySay1(222 );
3、统计字符串出现最多的字符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 let str = 'afjghdfraaaasdenas' ;function findMaxDuplicateChar (str ) { if (str.length === 1 ) return str; let charObj = {}; for (let i=0 ; i<str.length; i++) { if (!charObj[str.charAt(i)]){ charObj[str.charAt(i)] = 1 ; } else { charObj[str.charAt(i)] += 1 ; } } let maxChar = '' , maxValue = 1 ; for (let key in charObj) { if (charObj[key] >= maxChar) { maxChar = key; maxValue = charObj[key]; } } return { maxChar, maxValue } }
4、统计字符串中第一个唯一字符 1 2 3 4 5 6 7 8 9 10 11 12 let str = 'leetcode' ; function findFirstUniqChar (str ) { for (let i=0 ; i<str.length(); i++) { let curChar = str[i]; if (str.lastIndexOf(curChar) === str.indexOf(curChar)) { return i; } } return -1 ; }
5、找出数组中出现次数最多的元素,并给出其出现过的位置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 let arr = [1 , 2 , 1 , 1 , 4 , 5 , 6 ];function findMostItemByArr (arr ) { let mostItem, indexs = [], obj = {}; for (let i=0 ; i<arr.length; i++) { let item = arr[i].toString(); obj[item] ? obj[item].push(i) : obj[item] = [].concat(i); } let tempArr = Object .entries(obj); mostItem = parseInt (tempArr[0 ][0 ]); indexs = tempArr[0 ][1 ]; for (const [key, value] of tempArr) { if (indexs.length < value.length) { mostItem = parseInt (key); indexs = value; } } return { mostItem, indexs, } }
6、数组扁平化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function flatten (arr ) { const result = []; for (let i = 0 ; i < arr.length; i++) { if (Array .isArray(arr[i])) { result = result.concat(flatten(arr[i])); } else { result = result.concat(arr[i]); } } return result; } if (!Array .prototype.flat) { Array .prototype.flat = function ( ) { return [].concat(...this.map(item => Array .isArray(item) ? item.flat() : [item])); } }
7、讲数组扁平化并去除其中重复数据, 最终得到一个升序且不重复的数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 let arr = [ [1 , 2 , 2 ], [3 , 4 , 5 , 5 ], [6 , 7 , 8 , 9 , [11 , 12 , [12 , 13 , [14 ] ] ] ], 10 ];Array .prototype.flat = function ( ) { return [].concat(...this.map(item => Array .isArray(item) ? item.flat() : [item])); } Array .prototype.unique = function ( ) { return [...new Set (this )]; } arr.flat().unique().sort((a, b ) => a -b);
8、旋转数组 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
1 2 3 4 5 6 7 8 9 let arr = [1 , 2 , 3 , 4 , 5 , 6 , 7 ];function rotate (arr, k ) { for (let i=0 ; i<k; i++) { let temp = arr.pop(); arr.unshift(); } return arr; }