Изменить родительское свойство в данных древовидной структуры с помощью рекурсивного вызова в js - PullRequest
1 голос
/ 15 апреля 2019

У меня есть следующий объект

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);

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

1001 * попробовать *

let reverseIt = o=> o.children ? 
  o.clicked=o.children.reduce((a,c)=>a||o.clicked||reverseIt(c),!1) : o.clicked;

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}]}]};

let reverseIt = o=> o.children ? o.clicked=o.children.reduce((a,c)=>a||o.clicked||reverseIt(c),!1) : o.clicked;

// TEST
reverseIt(obj);
console.log(obj);
0 голосов
/ 15 апреля 2019

Вам нужно немного изменить свою функцию:

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: true,
          }
        ]
      },
      {
        ID: 5,
        clicked: false,
      }
    ]
  }]
};

function reverseIt(obj) {
  if (!obj.children) {
    return obj;
  }
  if (obj.children.some(c => c.children)) {
    obj.children = obj.children.map(child => reverseIt(child));
  }
  obj.clicked = obj.children[0].clicked;
  return obj;
}
console.log(reverseIt(obj));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...