1.防抖
let div = document.querySelector('.box');
const debounce = (func, wait) => {
let timer;
return function () {
clearTimeout(timer);
timer = setTimeout(() => {
func();
}, wait);
};
};
function doSomeThing() {
console.log('防抖');
}
div.onclick = debounce(doSomeThing, 1000);
2.节流
var flg = true;
var nowDate = true;
let div = document.querySelector('.box');
function throttle(callback, time) {
if (!flg) {
return;
}
flg = false;
if (!nowDate) {
setTimeout(() => {
callback();
flg = true;
}, time);
} else {
callback();
nowDate = false;
flg = true;
}
}
function fn() {
console.log('节流');
}
div.onclick = function () {
console.log('=====鼠标点击======');
throttle(fn, 3000);
};
3.递归深拷贝
function deepClone(source) {
if (source === null) return null;
if (typeof source !== 'object') return source;
if (source instanceof RegExp) {
return new RegExp(source);
}
if (source instanceof Date) {
return new Date(source);
}
let targetObj = new Object();
for (let keys in source) {
if (source.hasOwnProperty(keys)) {
targetObj[keys] = deepClone(source[keys]);
}
}
return targetObj;
}
const originObj = {
a: 'a',
b: 'b',
c: [1, 2, 3],
d: { dd: 'dd' },
e: '\n\g',
};
const cloneObj = deepClone(originObj);
console.log(cloneObj === originObj);
cloneObj.a = 'aa';
cloneObj.c = [1, 1, 1];
cloneObj.d.dd = 'doubled';
console.log(cloneObj);
console.log(originObj);
4.多维数组拍平
let array = [[41, 3], 2, 5, 6, [1, 5, 6, [2, 35]]];
const flatten = (arr) => {
return arr.reduce((acc, val) => {
return acc.concat(Array.isArray(val) ? flatten(val) : val);
}, []);
};
console.log(flatten(array));
5.实现promise
function Promise(executor){
let self = this;
self.status = 'pending';
self.value = undefined;
self.reason = undefined;
function resolve(value){
if(self.status === 'pending'){
self.status = 'resolved';
self.value = value;
}
}
function reject(reason){
if(self.status === 'pending'){
self.status = 'rejected';
self.reason = reason;
}
}
executor(resolve,reject);
}
Promise.prototype.then = function(onFufiled,onRejected){
let self = this;
if(self.status === 'resolved'){
onFufiled(self.value);
}
if(self.status === 'rejected'){
onRejected(self.reason);
}
}
6.递归实现累加
function addCount(num){
if(num===1){
return 1
}
return num+addCount(num-1)
}
console.log(addCount(5))
7.递归 根据子元素找到父级元素
export function getParent(data2, nodeId2) {
var arrRes = [];
if (data2.length == 0) {
if (nodeId2) {
arrRes.unshift(data2);
}
return arrRes;
}
let rev = (data, nodeId) => {
for (var i = 0, length = data.length; i < length; i++) {
let node = data[i];
if (node.id == nodeId) {
arrRes.unshift(node);
rev(data2, node.pid);
break;
} else {
if (node.child) {
rev(node.child, nodeId);
}
}
}
return arrRes;
};
arrRes = rev(data2, nodeId2);
return arrRes;
}
8.判断一个字符串中出现次数最多的字符,统计这个次数
let str = 'asdfssaaasasasasaa'
let json = {}
for (let i = 0; i < str.length; i++) {
if(!json[str.charAt(i)]) {
json[str.charAt(i)] = 1
} else {
json[str.charAt(i)]++
}
};
let iMax = 0
let iIndex = ''
for(let i in json) {
if(json[i] > iMax) {
iMax = json[i]
iIndex = i
}
}
console.log('出现次数最多的是:' + iIndex + '出现' + iMax + '次')