function debounce(fn){
let timeout = null
return function(){
clearTimeout(timeout)
timeout = setTimeout(()=>{
fn.apply(this,arguments)
},500)
}
}
function throttle(fn){
let canRun = true
return function(){
if(!canRun) return false
canRun = false
setTimeout(()=>{
fn.apply(this,arguments)
canRun = true
},500)
}
}
function add(){
let _args = Array.prototype.slice.call(arguments)
var _adder = function(){
_args.push(...arguments)
return _adder
}
_adder.toString = function(){
return _args.reduce((a,b)=>{
return a+b
})
}
return _adder
}
console.log(add(1)(2)(3));
console.log(add(1, 2)(3));
var arr = [1, 2, 3, 4];
var sum = arr.reduce((x,y)=>x+y)
var mul = arr.reduce((x,y)=>x*y)
console.log( sum );
console.log( mul );
let language = ['Chinese', 'English', 'Japanese', 'Chinese', 'English'];
let languageNum = language.reduce((total,cur)=>{
if(cur in total){
total[cur]++
}else{
total[cur] = 1
}
return total
},{})
console.log(languageNum);
let arr2 = [1,2,3,4,4,1]
let newArr = arr2.reduce((total,cur)=>{
if(!total.includes(cur)){
return total.concat(cur)
}else{
return total
}
},[])
console.log(newArr);
let arr3 = [23,123,342,12];
let max = arr3.reduce((total,cur,index,arr) => {
return total > cur ? total : cur
});
console.log(max)
let arr4 = [68,168,666,12];
let max4 = arr4.reduce((total,cur,index,arr) => {
return total > cur ? total : cur
});
console.log(max4)
let str = '1688';
let strParseInt = str.split('')
.map(item => {return item.charCodeAt() - 48})
.reduce((a, b) => {return a * 10 + b})
console.log(strParseInt)
let arr6= [[0, 1], [2, 3], [4, 5]]
let newArr6 = arr6.reduce((total,cur)=>{
return total.concat(cur)
},[])
console.log(newArr6);
var result = [{ subject: 'male', score: 45}, { subject: 'female', score: 50}];
var sum = result.reduce(function(total, cur) {
return cur.score + total;
}, 0);
console.log(sum)
Array.prototype.reduceFunc = function(fn,initValue){
let acc = initValue || this[0]
const startIndex = initValue?0:1
for(let i=startIndex;i<this.length;i++){
acc = fn(acc,this[i],i,this)
}
return acc
}
var arr = [1,2,3,4]
var result=arr.reduceFunc((a,b)=>{
return a+b
},0)
console.log(result)
Function.prototype.bind = function(fn){
const _args = [].slice.call(arguments,1)
const context = this
return function(){
const args = _args.concat([].slice.call(arguments,1))
return context.apply(fn,_args)
}
}
var arr = [3,4,1,2];
function bubbleSort(arr){
var len = arr.length-1
var flag = true
for(var i = 0;i<len;i++){
for(var j=0;j<len-i;j++){
if(arr[j]>arr[j+1]){
var temp = arr[j]
arr[j]=arr[j+1]
arr[j+1]=temp
flag=false
}
}
if(flag){
break
}
}
return arr
}
console.log(bubbleSort(arr))
var arrQuick = [15,13,3,2,7]
function quickSort(arrQuick){
if(arrQuick.length<=1){
return arrQuick
}
var pivotIndex = Math.floor(arrQuick.length/2)
var pivot = arrQuick.splice(pivotIndex,1)[0]
var left = []
var right = []
for(var i=0;i<arrQuick.length;i++){
if(arrQuick[i]<pivot){
left.push(arrQuick[i])
}else{
right.push(arrQuick[i])
}
}
return quickSort(left).concat([pivot],quickSort(right))
}
console.log(quickSort(arrQuick))
function request(urls,max,callback){
let urlsCopy = [...urls]
let index = 0
function req(){
index++
console.log('当前并发数-----',index)
fetch(urlsCopy.shift()).then(res=>{ //把数组的第一个元素从其中删除,并返回第一个元素的值,且改变原数组
index--
if(urlsCopy.length>0){
req()
}else if(index===0){
callback && callback()
}
})
if(index<max){
req()
}
}
req()
}
function fetch(url){
let time = Math.random()*1000 +1000
console.log("time-------",time)
return new Promise((resolve,reject)=>{
try{
setTimeout(()=>{resolve()},time)
}catch(e){
reject(e)
}
})
}
let urlArray=[1,2,3,4,5,6,7,8,9]
function cb(){
console.log('finally')
console.timeEnd()
}
console.time()
request(urlArray,8,cb)
let eventEmitter = {
list: {},
on (event, fn) {
let _this = this;
(_this.list[event] || (_this.list[event] = [])).push(fn);
return _this;
},
once (event, fn) {
let _this = this;
function on () {
_this.off(event, on);
fn.apply(_this, arguments);
}
on.fn = fn;
_this.on(event, on);
return _this;
},
off (event, fn) {
let _this = this;
let fns = _this.list[event];
if (!fns) return false;
if (!fn) {
fns && (fns.length = 0);
} else {
let cb;
for (let i = 0, cbLen = fns.length; i < cbLen; i++) {
cb = fns[i];
if (cb === fn || cb.fn === fn) {
fns.splice(i, 1);
break
}
}
}
return _this;
},
emit () {
let _this = this;
let event = [].shift.call(arguments),
fns = [..._this.list[event]];
if (!fns || fns.length === 0) {
return false;
}
fns.forEach(fn => {
fn.apply(_this, arguments);
});
return _this;
}
};
function user1 (content) {
console.log('用户1订阅了:', content);
}
function user2 (content) {
console.log('用户2订阅了:', content);
}
function user3 (content) {
console.log('用户3订阅了:', content);
}
function user4 (content) {
console.log('用户4订阅了:', content);
}
eventEmitter.on('article1', user1);
eventEmitter.on('article1', user2);
eventEmitter.on('article1', user3);
eventEmitter.off('article1', user2);
eventEmitter.once('article2', user4)
eventEmitter.emit('article1', 'Javascript 发布-订阅模式');
eventEmitter.emit('article1', 'Javascript 发布-订阅模式');
eventEmitter.emit('article2', 'Javascript 观察者模式');
eventEmitter.emit('article2', 'Javascript 观察者模式');
var source = [{ id: 1, pid: 0, name: 'body'}, { id: 2, pid: 1, name: 'title'}, { id: 3, pid: 1, name: 'div'}, { id: 4, pid: 3, name: 'span'}, { id: 5, pid: 3, name: 'icon'}, { id: 6, pid: 4, name: 'subspan'}]
function toTree(data) {
let result = []
if(!Array.isArray(data)) {
return result
}
data.forEach(item => {
delete item.children;
});
let map = {};
data.forEach(item => {
map[item.id] = item;
});
data.forEach(item => {
let parent = map[item.pid];
if(parent) {
(parent.children || (parent.children = [])).push(item);
} else {
result.push(item);
}
});
return result;
}
console.log(toTree(source))