目标:有一个对象数组,已知某个 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 属性已经被重新赋值: