Javascript обновляет значения во вложенном объекте путем массива - PullRequest
0 голосов
/ 27 ноября 2018

С учетом вложенного объекта:

{
    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: []
            }]
        }
    ]
}

Я пытался реализовать это с помощью рекурсии, но пока безуспешно.Я искал вопросы, и ни один из них не соответствовал моей нынешней ситуации.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

простой пример использования рекурсии, объяснения в коде в виде комментариев

const obj = {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: []}]}]};

const checkAndChange = (obj) => { // function that will check if name exists in array and change toggle and active properties
  const arr = ['UK', 'Region 2', 'Gatwick North'];
  if (arr.includes(obj.name)) {
    obj.toggled = true;
    obj.active = true;
  }
}

const recursion = (obj) => {
   const o = obj;
   checkAndChange(o); // check if name exists in array and change toggle and active properties
   if (o.children.length > 0) { // check if has children
   		o.children.forEach(v => { // if has children do the same recursion for every children
      	recursion(v);
      });
   }
   return o; // return final new object
}

console.log(recursion(obj));
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 27 ноября 2018

Используйте рекурсивный метод, чтобы найти путь и обновить значение.

var obj = [{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: []}]}]}];

function FilterArray(temp2,i){
 temp2.filter(function(el){
      if(el['name']==path[i]){
         el['toggled']=true;
          el['active']=true;
        if(i!=path.length-1){
          FilterArray(el['children'],++i);
        }
      }
  });
}

console.log("Before");
console.log(obj);
var path=['UK', 'Region 2', 'Gatwick North'];
FilterArray(obj,0);

console.log("After");
console.log(obj);
...