Javascript 在js中通过递归调用更改树结构数据中的父属性

Javascript 在js中通过递归调用更改树结构数据中的父属性,javascript,arrays,algorithm,object,tree,Javascript,Arrays,Algorithm,Object,Tree,我有以下目标 let obj = {children:[ { ID:1, clicked: false, children: [ { ID:4, clicked: false, children: [ { ID:11, clicked: false,

我有以下目标

let obj = {children:[
{
    ID:1,
    clicked: false,
    children: [
        {
            ID:4,
            clicked: false,
            children: [
                {
                    ID:11,
                    clicked: false,
                    children: [
                                {
                                    ID:14,
                                    clicked: true,
                                },
                                {
                                    ID:15,
                                    clicked: false,
                                }
                            ]
                },
                {
                    ID:12,
                    clicked: false,
                }
            ]
        },
        {
            ID:5,
            clicked: false,
        }
    ]
  }
 ]
}
我需要将父对象的clicked属性更改为true。因此,在本例中,ID-14已将属性单击为true。因此,ID为11,4,1的父母也将拥有与true相同的属性

据我所知,DFS将被应用。 我已经尝试了以下代码,但不是在所有情况下都有效

function reverseIt(obj) {
  if(obj.children == undefined) {
      return obj.clicked;
  }

  for(i = 0; i < obj.children.length; i++) {
    if(!obj.children[i].clicked) {
        obj.children[i].clicked = reverseIt(obj.children[i]);
    }
    return obj.children[i].clicked;
  }
  return true;
}
reverseIt(obj);
功能反转(obj){
if(obj.children==未定义){
返回obj.clicked;
}
对于(i=0;i
您需要稍微更改您的功能:

让obj={
儿童:[{
ID:1,
点击:错,
儿童:[{
ID:4,
点击:错,
儿童:[{
ID:11,
点击:错,
儿童:[{
身份证号码:14,
对,,
},
{
身份证号码:15,
点击:错,
}
]
},
{
ID:12,
对,,
}
]
},
{
ID:5,
点击:错,
}
]
}]
};
功能反转(obj){
如果(!对象子对象){
返回obj;
}
if(obj.children.some(c=>c.children)){
obj.children=obj.children.map(child=>reverseIt(child));
}
obj.clicked=obj.children[0]。已单击;
返回obj;
}
console.log(reverseIt(obj))试试看

let obj={children:[{ID:1,clicked:false,children:[{ID:4,clicked:false,children:[{ID:14,clicked:true},{ID:15,clicked:false}]},{ID:12,clicked:false},{ID:5,clicked:false}]};
让我们反过来t=o=>o.孩子们?o、 clicked=o.children.reduce((a,c)=>a | | o.clicked | | | reverseIt(c),!1):o.clicked;
//试验
反转(obj);

控制台日志(obj)我已经编辑了我的问题。一次只能有一个为真,因此假设唯一的ID-12为真,在这种情况下,4,1也将为真。没有解决你的问题。只要换一个孩子,看看是否所有的父母都受到影响。对不起@VikasChauhan,我不明白-12是真的,4和1也是真的-这不是你想要的吗?请详细说明您想要什么。将给定对象中ID:12的clicked属性更改为false。解决方案应给出其父项(ID为4和1)也将单击为true。这在所有情况下都应该是通用的。对于任何一个孩子来说,他们的父母都会选择正确的答案。清楚吗?谢谢@Kamil Kiełczewski:-)现在工作。测试了5-6个测试用例。工作很有魅力,有一个问题。请您通过将ID:11设置为true进行检查,在这种情况下,将所有父项设置为false。我认为只有当最后一个孩子的值为真时,它才起作用。如果它在中间,它应该跟在父对象后面。@VikasChauhan是的,你是对的-我制作了修复和更新代码段,你可以让它对多个对象起作用。像{children:[{},{}]}@VikasChauhan我不明白-你能提供哪个解决方案的ID不起作用吗?
let reverseIt = o=> o.children ? 
  o.clicked=o.children.reduce((a,c)=>a||o.clicked||reverseIt(c),!1) : o.clicked;