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"