1、冒泡排序
依次比较两个相邻的元素,如果顺序错误就把他们交换过来。
const arr = [911,520,888,666,555,2323]function bubbleSort(arr){let temp;for (let i = 0; i < arr.length-1; i++) {for (let j = 0; j < arr.length-1-i; j++) {if (arr[j]>arr[j+1]) {temp = arr[j];arr[j]= arr[j+1];arr[j+1] = temp;}}}return arr;}console.log(bubbleSort(arr));
2、递归(深拷贝)
function deepClone(obj){if (typeof obj !== 'object' || obj == null) {return obj;}var result = obj instanceof Array?[]:{};for (const k in obj) {if (obj.hasOwnProperty(k)) {result[k] = deepClone(obj[k]);}}return result;}const obj = {name:"cq",age:18,still:{web:'vue',others:'react'}}const newObj = deepClone(obj)newObj.still.web = 'angular'console.log(newObj);console.log(obj);
3、数组去重
function unique1(arr){for (let i = 0; i < arr.length; i++) {for (let j = i+1; j < arr.length; j++) {if(arr[i] === arr[j]){arr.splice(j,1);j--;}}}return arr;}function unique2(arr){var result = [];for(let i=0;i<arr.length;i++){if(result.indexOf(arr[i]) === -1){result.push(arr[i])}}return result;}function unique3(arr){return Array.from(new Set(arr))}const arr = [1,2,3,1,1,2,4]console.log(unique1(arr));console.log(unique2(arr));console.log(unique3(arr));
4、快速排序
(1)在数据集之中,选择一个元素作为”基准”(pivot)。
(2)所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。
(3)对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
const arr = [911,520,888,666,555,2323]//阮一峰版function quickSort(arr){if (arr.length<=1) return arr;var pivotIndex = 0;var pivot = arr.splice(pivotIndex,1)[0];var left = [];var right = [];for (let i = 0; i < arr.length; i++) {if(arr[i]<pivot){left.push(arr[i])}else{right.push(arr[i])}}return quickSort(left).concat([pivot],quickSort(right))}//新版function quickSort(arr) {function swap(arr, i, k) {let temp = arr[i];arr[i] = arr[k];arr[k] = temp;}// 数组分区,左小右大function partition(arr, left, right) {let storeIndex = left;let pivot = arr[right]; // 直接选最右边的元素为基准元素for(let i = left; i < right; i++) {if(arr[i] < pivot) {swap(arr, storeIndex, i);storeIndex++; // 交换位置后,storeIndex 自增 1,代表下一个可能要交换的位置}}swap(arr, storeIndex, right); // 将基准元素放置到最后的正确位置上return storeIndex;}function sort(arr, left, right) {if(left > right) {return;}let storeIndex = partition(arr, left, right);sort(arr, left, storeIndex - 1);sort(arr, storeIndex + 1, right);}sort(arr, 0, arr.length - 1);return arr;}console.log(quickSort(arr));
5、翻转字符串
function reverseString(str) {str=str.split('').reverse().join('');return str;}reverseString("hello");
6、翻转二叉树
这是一道很经典的二叉树问题。显然,我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转。如果当前遍历到的节点 root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以root 为根节点的整棵子树的翻转。
var invertTree = function(root) {if (root === null) {return null;}const left = invertTree(root.left);const right = invertTree(root.right);root.left = right;root.right = left;return root;};//测试var obj={'id':'4','left':{'id':'2','left':{'id':'1','left':null,'right':null},'right':{'id':'3','left':null,'right':null}},'right':{'id':'7','left':{'id':'6','left':null,'right':null},'right':{'id':'9','left':null,'right':null}}}invertTree(obj);console.log(obj);
leetcode链接:https://leetcode-cn.com/problems/invert-binary-tree/
7、防抖节流
防抖:事件触发后,在n秒内,如果再次触发事件,则会重新计时
debunce(fn,delay){let timer = null;return function(){if(timer){clearTimeout(timer)}timer = setTimeout(() =>{fn()},delay)}}
节流:事件触发后,在n秒内,再次触发事件,都会无效,只会触发一次
throttle(fn,delay){let lock = truereturn function () {if(!lock){return}lock = falsesetTimeout(() => {fn()lock = true},delay)}},
8、打印 out5 in0 in1 in2 in3 in4
for (var i = 0; i < 5; i++) {(function(i){setTimeout(async function() {console.log('in', i);}, 1000);})(i)}console.log('out', i);
9、判断一个{}为空
var a = {}console.log(JSON.stringify(a) === '{}');
