节流,防抖,new函数,柯里化,扁平化数据,树状化数据_柯里化构造器

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

new

  1. ES6语法糖class原理
function myNew(Func,...args){
  const instance={}
  if(Func.prototype){ // 如果函数原型存在,将instance指向原型对象上去
    Object.setPrototypeOf(instance,Func.prototype)
  }
  const res=Func.apply(instance,args) // 调用构造器,并将内部的this用instance来代替
  if(typeof res==='function' || typeof res==='object' && typeof res===null){ // 兼容处理下返回值
    return res
  }
  return instance

}
function  Person(name){
  this.name=name
}
Person.prototype.eat=function (){
  console.log(this.name+'吃饭')
}
const p1=myNew(Person,'jakc')
p1.eat()
// jack吃饭

柯里化

  1. 函数柯里化就是我们给一个函数传入一部分参数,此时就会返回一个函数来接收剩余的参数,后面执行返回的那个函数
  2. 将函数的一个参数拆分为两个乃至更多参数
function curry(func){
  return function curried(...args){
 	 // 传入的参数大于等于原始函数func的参数个数,则直接执行该函数
    if(args.length >= func.length){
      return func.apply(this, args)
    }
    /\*\*
 \* 传入的参数小于原始函数fn的参数个数时
 \* 则继续对当前函数进行柯里化,返回一个接受所有参数(当前参数和剩余参数) 的函数
 \*/
    return function (...args2){
      return curried.apply(this,args.concat(args2))
    }
  }
}
function sum(a,b,c){
  return a+b+c
}
const curriedSum=curry(sum)

console.log(curriedSum(1,2,3))
console.log(curriedSum(1)(2,3))
console.log(curriedSum(1)(2)(3))
// 输出结果都为6

扁平化数据

	const newArr=[
	{
		id: 'a', 
		pid: 0, 
		value: '陕西', 
		children:[
			{
				 id: 1,
				 pid: 'a', 
				 value: '西安', 
				 children:[
				 		{id: 301, pid: 1, value: '雁塔区'},
				 		{id: 302, pid: 1, value: '高新区'}
				 ]
			},
			{
				id: 2,
				pid: 'a', 
				value: '渭南',
				children:[]
			},
			{
				id: 3, 
				pid: 'a', 
				value: '咸阳',
				children:[]
			},
		]
	},
	{
		id: 'b', 
		pid: 0, 
		value: '广东',
		children:[
			{
				id: 11, pid: 'b', value: '广州',children:[]
			},
			{
				id: 12, pid: 'b', value: '深圳',children:[]
			},
			{
				id: 13, pid: 'b', value: '潮汕', children:[]
			}
		]
	}
]
function toLine(data,result=[]){
    data.forEach(item=>{
      if(item.children){
        result.push({
          id:item.id,
          pid:item.pid,
          value:item.value,
        })
        toLine(item.children,result)
      }else {
        result.push({
          id:item.id,
          pid:item.pid,
          value:item.value,
        })
      }
    })
    return result

  }

 toLine(newArr)

扁平化后数据

[
	{id: 'a', pid: 0, value: '陕西'},
	{id: 1, pid: 'a', value: '西安'},
	{id: 301, pid: 1, value: '雁塔区'},
	{id: 302, pid: 1, value: '高新区'},
	{id: 2, pid: 'a', value: '渭南'},
	{id: 3, pid: 'a', value: '咸阳'},
	{id: 'b', pid: 0, value: '广东'},
	{id: 11, pid: 'b', value: '广州'},
	{id: 12, pid: 'b', value: '深圳'},
	{id: 13, pid: 'b', value: '潮汕'},
]

树状化数据

var data=[
    {pid:0,id:'a',value:'陕西'},
    {pid:'a',id:1,value:'西安'},
    {pid:1,id:301,value:'雁塔区'},
    {pid:1,id:302,value:'高新区'},
    {pid:'a',id:2,value:'渭南'},
    {pid:'a',id:3,value:'咸阳'},
    {pid:0,id:'b',value:'广东'},
    {pid:'b',id:11,value:'广州'},
    {pid:'b',id:12,value:'深圳'},
    {pid:'b',id:13,value:'潮汕'},

  ];
  function  toTree(data,pid) {
    function tree(pid){
      let arr=[]
      data.filter(item=> {
        return item.pid === pid // 过滤下与传入的pid(最顶层的pid号)相等的item,也就代表是最顶层,
      }).forEach(item=>{
        arr.push({
          id:item.id,
          pid:item.pid,
          value:item.value,
          children:tree(item.id) // 递归调用tree,渲染相同id的一组
        })
      })
      return arr
    }
    return tree(pid)
  }

 const newArr=toTree(data,0) // 传入的0代表最顶层数据的pid是0
 

渲染后树状结构

[
	{
		id: 'a', 
		pid: 0, 
		value: '陕西', 
		children:[
			{


![img](https://img-blog.csdnimg.cn/img_convert/b253bc02c089f4e1c56f0d571e84c7f2.png)
![img](https://img-blog.csdnimg.cn/img_convert/8ab27ebde9c4efe38d29ed668018e1af.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值