递归遍历树形结构,根据属性值查找所在对象

本文介绍了如何针对一个对象数组,通过递归遍历的方法,找到具有特定id的对象并修改其children属性。目标是当知道某个id时,能够有效地更改该id对应对象的children值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标:有一个对象数组,已知某个 id 属性的值,改变其所在对象的 children 属性值。

方法:通过递归方式遍历对象数组,找到指定 id 对应的对象,改变该对象的 children 属性值。

具体实现:

// 原始对象数组[数据结构是这样的,但是每层有多少数据是不一定的]
var originData = [{
	id: 1,
	name: 'name1',
	children: [{
		id: 11,
		name: 'name11',
		children: [{
			id: 111,
			name: 'name111',
			children: [{
				id: 1111,
				name: 'name1111'
			}]
		}, {
			id: 112,
			name: 'name112'
		}]
	}]
}, {
	id: 2,
	name: 'name2',
	children: [{
		id: 21,
		name: 'name21',
		children: [{
			id: 211,
			name: 'name211'
		}, {
			id: 212,
			name: 'name212',
			children: [{
				id: 2121,
				name: 'name2121'
			}]
		}]
	}]
}, {
	id: 3,
	name: 'name3',
	children: [{
		id: 31,
		name: 'name31',
		children: [{
			id: 311,
			name: 'name311',
			children: [{
				id: 3111,
				name: 'name3111',
				children: [{
					id: 31111,
					name: 'name31111'
				}]
			}]
		}]
	}]
}];

// 用来给目标属性赋值的数据
var setData = [{
	id: 9,
	name: 'name9',
	children: [{
		id: 91,
		name: 'name91',
		children: [{
			id: 911,
			name: 'name911',
			children: [{
				id: 9111,
				name: 'name9111'
			}]
		}]
	}, {
		id: 92,
		name: 'name92'
	}]
}];

function recursion(data, current, setData) {
	var result = null;
    if(!data){
       return;
    }
    for(var i in data){
    	if(result !== null) {
    		break;
    	}
        var item = data[i];
        if(item.id == current){
        	item.children = setData;  //改变 children 属性值
            result = item;
            break;
        }else if(item.children && item.children.length > 0){
            result = recursion(item.children, current, setData);
        }
    }
    return result;
}

var findId = 111;  // 要查找的 id 属性值

var obj = recursion(originData, findId, setData);   // 返回根据 id 查找到的数据对象
console.log(obj);

可以看到,id 为 111 的对象的 children 属性已经被重新赋值:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值