js递归函数及深浅拷贝

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>递归函数及深浅拷贝</title>
	</head>
	<body>
		
		<script>
		// 递归函数:一个函数在内部调用本身,我们就说这个函数是递归函数,自己调用自己,防止栈溢出,一定要加上return;
		// 打印6句话
		let num=1;
		function fn(){
			console.log("递归打印");
			if(num<=6){
				console.log(num);
				num++;
				fn();
			}
			return;
		}
		fn();
		// 应用:利用递归求阶乘
		function f(n){
			// 递归必须加return实行退出
			if(n==1) return 1;
			return  n*f(n-1);
		}
		console.log(f(4));
		// 递归求斐波那契数列(兔子数列)1 1 2 3 5 8 13 21 ...前两项的和就是后一项
		// 01 用户输入一个数字,就可以求出是这个数字对应的兔子序列  输入3 打印3对应的序列值2
		let start=0;
		let sum;
		function g(n){
			if(n==2||n==1) return 1;
			return g(n-1)+g(n-2);
		}
		console.log("递归数列:")
		console.log(g(3));
	  // 02 应用 根据id返回数据对象
	  var data=[{
		  id:1,
		  name:'家电',
		  goods:[{
			  id:11,
			  gname:'冰箱'
		  },{
			  id:12,
			  gname:'洗衣机'
		  },{
			  id:13,
			  gname:'服饰'
		  }]
	  },
	  {
	  		  id:2,
	  		  name:'哈哈',
	  		  goods:[{
	  			  id:21,
	  			  gname:'冰箱2'
	  		  },{
	  			  id:22,
	  			  gname:'洗衣机2'
	  		  },{
	  			  id:23,
	  			  gname:'服饰2'
	  		  }]
	  }]
	 var ooo={};
	  function getId(arr,id){
		// 遍历数组
		arr.forEach((item)=>{
			if(item.id==id){
				ooo=item;
				return item;  //赋值给else if的递归结果
				// 利用递归,遍历里层数据  如果外面没有的话
			}else if(item.goods && item.goods.length>0){
					ooo=getId(item.goods,id);
				}
		});
		return ooo;
	  }
	    console.log("根据id返回对象:")
		console.log(getId(data,1));
		console.log(getId(data,12));
		console.log(getId(data,23));
		
		// 3-浅拷贝 拷贝一层  里面的goods拷贝的是地址 导致两个地址一样
		var b=[];
	   // 浅拷贝方法1
		// for(let key in data){
		// 	b[key]=data[key];
		// }
		// 浅拷贝方法2
		Object.assign(b,data);
		console.log("b拷贝")
		console.log(b);  
		b[0].goods[0].gname="呵呵呵浅拷贝地址相同改名";  //导致b和 data都改了
		console.log(data);
		
		//04深拷贝  将拷贝的数据开辟另外的空间
		function deepClone(obj){
			if(typeof(obj)!="object"||!obj) return;
			let newObj=Array.isArray(obj)?[]:{};
			for(let key in obj){
				// 拥有key值
			   if(obj.hasOwnProperty(key)){
				   // 进行递归  数组对象就递归deepClone再次查询 简单类型直接赋值
				   newObj=typeof(key)=="object"?deepClone(obj[key]):obj[key];
			   }
			}
			return newObj;
		}
		c=deepClone(data);
		console.log("深拷贝")
		console.log(c);
		c.goods[0].gname="深拷贝修改";
		console.log(data); //深拷贝没有修改到原先的数据
		</script>
	</body>
</html>

猜你喜欢

转载自blog.csdn.net/enhenglhm/article/details/123910086