谨记录项目中遇到的方法以及算法
防抖节流
function debounce(fn,delay){
let timer= null
return function(){
if(timer)clearTimeout(timer)
timer = setTimeout(()=>{
fn.apply(this,[...arguments])
},delay)
}
}
function throttle(fn,delay){
let startTime = new Date().getTime()
return function (){
let endTime = new Date().getTime()
if(delay<endTime-startTime){
fn.apply(this,[...arguments])
startTime = endTime
}
}
}
字符串转成3位金额逗号隔开或n位隔开格式
function translate(str){
return str.split('').reverse().join('').replace(/(\w{3})/g,(n)=>n+',').split('').reverse().join('').replace(/^,/,'')
}
字符串下划线_驼峰相互转换
function underlineToHump(str){
return str.replace(/_(\w)/g,(n,l)=>l.toUpperCase())
}
function humpToUnderline(str){
return str.replace(/([A-Z])/g,(n)=>'_'+n.toLowerCase())
}
冒泡、归并、快排三种排序方式(算法)
function bubbleSort(arr) {
for(let i=0;i<arr.length-1;i++){
for(let j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
[arr[i],arr[j]]=[arr[j],arr[i]]
}
}
}
}
function mergeSort(arr){
if(arr.length<=1){
return arr
}
let midIndex = Math.floor(arr.length/2)
let mid = arr.splice(midIndex,1)[0]
let left = []
let right = []
arr.forEach((item)=>{
if(item<mid){
left.push(item)
} else {
right.push(item)
}
})
return [...mergeSort(left),mid,...mergeSort(right)]
}
function quickSort(arr,left=0,right=arr.length-1){
if(left>=right){
return arr
}
let base = arr[left]
let i = left
let j = right
while(j>i){
while(j>i&&arr[j]>=base){
j--
}
while(j>i&&arr[i]<=base){
i++
}
if(j>i){
[arr[i],arr[j]]=[arr[j],arr[i]]
}
[arr[left],arr[j]] = [arr[j],arr[left]]
quickSort(arr,left,j-1)
quickSort(arr,j+1,right)
return arr
}
}
深度优先遍历递归版(算法)
function dsf(root){
let arr = [...root]
arr.forEach((element)=>{
element.children&&element.children.length&&dsf(element.children)
})
}
深度优先遍历非递归版(算法)
function dsf(root){
let stack = [..root];
while(stack.length){
let pop = stack.pop()
let children = pop.children
if(children&&children.length){
let i = children.length
while(i){
i--
stack.push(children[i])
}
}
}
}
广度优先遍历(算法)
function bsf(root){
let queue = [...root]
while(queue.length){
let shift = queue.shift()
shift.children&&shift.children.length&&queue.push(...shift.children)
}
}
将平铺数组通过id->pid转化树结构
function flatArrToTree(arr,pid){
if(!pid){
for(let i=0;i<arr.length;i++){
let _pid = arr[i].pid
if(arr.filter(d=>d.id===_pid)){
pid =_pid
}
}
}
let tree = []
arr.forEach(element=>{
if(element.pid===pid){
let children = flatArrToTree(arr,element.id)
if(children.length){
element.children = children
}
tree.push(element)
}
})
return tree
}
将树结构通过字段检索返回一个新的树递归版
function searchName(tree,name){
let newTree = []
tree.forEach((element)=>{
if(element.children&&element.children.length){
if(element.name.includes(name)){
newTree.push({...element})
}else {
let children= searchName(element.children,name)
if(children.length){
let o = {
...element,
children
}
newTree.push(o)
}
}
}else {
element.name.includes(name)&&newTree.push({...element})
}
})
return newTree
}
将数组转化成链表结构(算法)
function arrToLink(arr){
if(arr.length<=1) return {value:arr[0]}
let head = {
value:arr[0]
}
let o = head
for(let i=1;i<arr.length;i++){
let no = {
value:arr[i]
}
o.next = no
o=no
}
return head
}
反转链表(算法)
function reverseLink(head){
let cur= head
let pre = null
let next = null
while(cur){
next = cur.next
cur.next = pre
if(!pre) delete cur.next
pre = cur
cur = next
}
return pre
}
字符串全排列(算法)
function wArrange(str){
if(str.length===1)return [str]
if(str.length===2)return [str[0]+str[1],str[1]+str[0]]
let s = str.substr(0,1)
let e = str.substr(1)
let r = wArrange(e)
let arr = []
r.forEach((element)=>{
for(let i =0;i<=element.length;i++){
arr.push(element.substr(0,i)+s+element.substr(i))
}
})
return arr
}
Promise 最大并发限制 ( 有n个请求, 每次只能并发请求m个,直到n个请求全部完成)
let createFetch = function (i) {
return function () {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`请求${i}完成`)
}, 2000 * Math.random())
})
}
}
let fetchs = []
for (let i = 0; i < 17; i++) {
fetchs.push(createFetch(i))
}
function maxConcurrency(https,max){
let firstArr = https.slice(0,max)
let left = https.slice(max)
let current = []
function start(htp){
let promise = htp()
current.push(promise)
promise.then((res)=>{
console.log(res)
console.log('当前正在请求数量:',current.length)
current.splice(current.findIndex(v=>v==promise),1)
let newHtp = left.shift()
if(newHtp){
start(newHtp)
}
})
}
}
maxConcurrency(fetchs,5)