Javascript按数组路径更新嵌套对象中的值
给定嵌套对象:Javascript按数组路径更新嵌套对象中的值,javascript,loops,recursion,nested,traversal,Javascript,Loops,Recursion,Nested,Traversal,给定嵌套对象: { name: 'UK', toggled: false, active: false, children: [{ name: 'Region 1', active: false, toggled: false, children: [{ name: 'Heathrow T1',
{
name: 'UK',
toggled: false,
active: false,
children: [{
name: 'Region 1',
active: false,
toggled: false,
children: [{
name: 'Heathrow T1',
toggled: false,
active: false,
children: []
},
{
name: 'HTT',
toggled: false,
active: false,
children: []
},
]
},
{
name: 'Region 2',
active: false,
toggled: false,
children: [{
name: Gatwick North,
active: false,
toggled: false,
children: []
}]
}
]
}
以及给定的路径
['UK', 'Region 2', 'Gatwick North']
如何将与上述数组匹配的嵌套对象中的路径的活动/切换属性添加为true
输出应如下所示:
{
name: 'UK',
toggled: true,
active: true,
children: [{
name: 'Region 1',
active: false,
toggled: false,
children: [{
name: 'Heathrow T1',
toggled: false,
active: false,
children: []
},
{
name: 'HTT',
toggled: false,
active: false,
children: []
},
]
},
{
name: 'Region 2',
active: true,
toggled: true,
children: [{
name: 'Gatwick North',
active: true,
toggled: true,
children: []
}]
}
]
}
我试图用递归实现这个,但到目前为止没有成功。我正在搜索问题,但没有一个问题符合我的当前情况。使用递归方法查找路径并更新值
var obj=[{name:'UK',切换:false,活动:false,子项:[{name:'Region 1',活动:false,切换:false,子项:[{name:'Heathrow T1',切换:false,活动:false,子项:[]},{name:'HTT',切换:false,活动:false,切换:false,子项:[{name:'Gatwick North',active:false,toggled:false,children:[]}]}];
函数过滤器阵列(temp2,i){
temp2.过滤器(功能(el){
if(el['name']==路径[i]){
el['toggled']=true;
el['active']=true;
if(i!=路径长度-1){
过滤器阵列(el[‘子对象’,++i);
}
}
});
}
控制台日志(“之前”);
控制台日志(obj);
var path=['UK','Region 2','Gatwick North'];
过滤阵列(obj,0);
控制台日志(“之后”);
console.log(obj);
使用递归的简单示例,解释在代码中作为注释
const obj={name:'UK',切换:false,active:false,children:[{name:'Region 1',active:false,切换:false,children:[{name:'Heathrow T1',切换:false,active:false,children:[]},{name:'Region 2',active false,切换:false,children[{name:'Gatwick North',active:false,toggled:false,children:[]}]};
const checkAndChange=(obj)=>{//函数,该函数将检查数组中是否存在名称,并更改切换和活动属性
const arr=['UK','Region 2','Gatwick North'];
if(包括(对象名称)){
obj.toggled=true;
obj.active=true;
}
}
常量递归=(obj)=>{
常数o=obj;
checkAndChange(o);//检查数组中是否存在名称,并更改切换和活动属性
如果(o.childrence.length>0){//检查是否有子级
o、 forEach(v=>{//if)让子对象对每个子对象执行相同的递归
递归(v);
});
}
return o;//返回最终的新对象
}
console.log(递归(obj));
.as控制台包装{max height:100%!important;top:0;}
基于一个非常:
Extra:同样的功能也可用于阵列
var arr = [
['item 0.0', 'item 0.1'],
['item 1.0', 'item 1.1'],
['item 2.0', 'item 2.1'],
]
console.log(deep_value(arr, [2,1])); // logs "item 2.1"
这将适用于嵌套数组 参数:
-
array
:要更新的数组-
路径
:要更新的内容([0]-数组[0],[2,1]-数组[2][1]等
)-
数据
:要分配的数据
函数updateArray(数组、路径、数据){
const index=path.shift();
if(路径长度){
if(!Array.isArray(数组[index])){
数组[索引]=[];
}
updateArray(数组[索引]、路径、数据);
}否则{
数组[索引]=数据;
}
}
请展示您所做的尝试,而不仅仅是编写您所做的。您的示例不起作用,属性仍然有效false@ArtyomAmiryan我认为只有最后的子项切换应该是真的。现在编辑代码,请检查数据集它应该是一个对象,而不是数组
var obj = {
foo: { bar: 'baz' }
};
alert(deep_value(obj, ['foo','bar'])); // alerts "baz"
var arr = [
['item 0.0', 'item 0.1'],
['item 1.0', 'item 1.1'],
['item 2.0', 'item 2.1'],
]
console.log(deep_value(arr, [2,1])); // logs "item 2.1"