深拷贝实现方式
function deepCopy(oldObj, newobj) {
for (var key in oldObj) {
var item = oldObj[key];
// 判断是否是对象
if (item instanceof Object) {
if (item instanceof Function) {
newobj[key] = oldObj[key];
} else {
newobj[key] = {}; //定义一个空的对象来接收拷贝的内容
deepCopy(item, newobj[key]); //递归调用
}
// 判断是否是数组
} else if (item instanceof Array) {
newobj[key] = []; //定义一个空的数组来接收拷贝的内容
deepCopy(item, newobj[key]); //递归调用
} else {
newobj[key] = oldObj[key];
}
}
}
封装通用柯里化函数
function curry() {
var fn = arguments[0]; // 获取要执行的函数
var args = [].slice.call(arguments, 1); // 获取传递的参数,构成一个参数数组
// 如果传递的参数已经等于执行函数所需的参数数量
if (args.length === fn.length) {
return fn.apply(this, args)
}
// 参数不够向外界返回的函数
function _curry(){
// 推入之前判断
// 将新接收到的参数推入到参数数组中
args.push(...arguments);
if(args.length === fn.length){
return fn.apply(this, args)
}
return _curry;
}
return _curry;
}
function add(a, b, c) {
return a + b + c;
}
console.log(curry(add)(1)(2)(3)); // 6
冒泡排序
function bubbleSort(arr) {
const len = arr.length;
for (let i = 0; i < len - 1; i++) {
for (let j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) { // 相邻元素两两对比
var temp = arr[j+1]; // 元素交换
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
函数防抖
/**
* 函数防抖
* @param {function} func 一段时间后,要调用的函数
* @param {number} wait 等待的时间,单位毫秒
*/
function debounce(func, wait){
// 设置变量,记录 setTimeout 得到的 id
let timerId = null;
return function(...args){
if(timerId){
// 如果有值,说明目前正在等待中,清除它
clearTimeout(timerId);
}
// 重新开始计时
timerId = setTimeout(() => {
func(...args);
}, wait);
}
}
函数节流
/**
*
* @param {要节流执行的函数} func
* @param {节流的时间间隔} wait
* @returns
*/
function throttle(func, wait) {
// timeout 存储计时器返回值
// args 存储参数
var timeout, args;
return function () {
args = arguments;
// 如果 timeout 有值,说明上一次的执行间隔时间还没过
if (!timeout) {
// 进入此 if 说明时间间隔已经过了
// 先执行一次要执行的函数
func.apply(null, args)
// 然后重新设置时间间隔
timeout = setTimeout(function () {
timeout = null;
}, wait);
}
}
}
实现数组去重
ES6方法(使用数据结构集合):
const array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
Array.from(new Set(array)); // [1, 2, 3, 5, 9, 8]
复制代码
ES5方法:使用map存储不重复的数字
const array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
uniqueArray(array); // [1, 2, 3, 5, 9, 8]
function uniqueArray(array) {
let map = {};
let res = [];
for(var i = 0; i < array.length; i++) {
if(!map.hasOwnProperty([array[i]])) {
map[array[i]] = 1;
res.push(array[i]);
}
}
return res;
}
数组扁平化
ES5方法
function flatten(arr) {
return arr.reduce((result, item) => {
return result.concat(Array.isArray(item) ? flatten(item) : item);
}, []);
}
ES6方法
let arr = [1, [2, [3, 4]]];
function flatten(arr) { return arr.flat(Infinity); }
console.log(flatten(arr));
Promise.all
Promise.myAll = function(promiseArr) {
return new Promise((resolve, reject) => {
const ans = [];
let index = 0;
for (let i = 0; i < promiseArr.length; i++) {
promiseArr[i]
.then(res => {
ans[i] = res;
index++;
if (index === promiseArr.length) {
resolve(ans);
}
})
.catch(err => reject(err));
}
})
}