<!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>
js递归函数及深浅拷贝
猜你喜欢
转载自blog.csdn.net/enhenglhm/article/details/123910086
今日推荐
周排行