需求:递归一个对象,我们更改其type全部为5;
我们首先思考如果用每一层的循环我们怎么取解决?
var data = [
{
label: '一级 1',
type: 1,
children: [{
label: '二级 1-1',
type: 1,
children: [{
type: 1,
label: '三级 1-1-1'
}]
}]
},
{
label: '一级 2',
type: 1,
children: [
{
label: '二级 2-1',
type: 1,
children: [{
type: 1,
label: '三级 2-1-1'
}]
},
{
type: 1,
label: '二级 2-2',
children: [{
type: 1,
label: '三级 2-2-1'
}]
}]
}
]
function gai(arr){
arr.forEach(function(val,i){
val.type = 5
val.children.forEach(function(val,i){
val.type = 5
val.children.forEach(function(val,i){
val.type = 5
})
})
})
console.log(arr)
}
gai(data)
//当然如果这个JSON数组再往下边深入怎么办,所以用每一层循环的方式又是分厂笨重,那么我们需要用递归的方法,因为我们发现每一层的代码基本上一样子,至少每一层都有type和children属性
function gai1(n){
//首先我们发现这个json对象先是一个数组所以先forEach();遍历出来所有的元素,当然用every()
//map()也行
n.forEach(item=>{
//for in s所有的属性
for(let k in item){
//如果属性值为type时候我们就可以用item[k]赋值2
if (k == "type") {
item[k] = 5;
}
//如果属性值为children时候我们就可以再继续用此函数
//当然赋参数时候赋的是item此时键为k的值,相当于一个json数组
if (k == "children") {
gai1(item[k])
}
}
})
return n
}
console.log(gai1(data));
//第一步是声明一个形参f
function ss(f){
//第二步骤是条件语句
if (f<10) {
//第三步打印所需要的内容
//打印一定要再回调之前,这样才会出现起始的情况
console.log(f)
//打印完了之后再回调并且当前值+1
ss(f+1);
}
}
ss(0)
//这里我们需要注意另外一个:看看下边的语句如何运行
function ss(f){
//第二步骤是条件语句
if (f<10) {
//第三步回调当前值+1
ss(f+1);
//第四步打印所需要的内容
console.log(f)
//10,9,8......0
}
}
ss(0)
这里我们要知道如果走到第三步的时候直接回调了函数,当前的log(f)值没有走留了下来,接着下来再走一下函数,发现留了多个log,所以会出现10,9,8,7,6,5...0
注明:使用递归让获取更加的简单