Отфильтровать вложенный объект от родительского объекта - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть родительский объект с дочерним массивом объектов, расположенных под ним.Каждый объект содержит ключ id с уникальным значением.Функция фильтра должна искать в родительском объекте id, если он не равен заданному id, то рекурсивно искать во вложенных объектах id, пока он не будет найден.Как только объект с данным ключом найден, удалите и верните обновленный myObject.

Структура выглядит следующим образом:

    let myObject = {
        key: 1,
        name: 'hello',
        children: [
            {
                key: 2,
                name: 'world',
                children: []
            },
            {
                key: 3,
                name: 'hope',
                children: [
                    {
                        key: 4,
                        name: 'you',
                        children: [{
                            key: 5,
                            name: 'are',
                            children: []
                        }]
                    },
                    {
                        key: 6,
                        name: 'having',
                        children: [{
                            key: 7,
                            name: 'fun',
                            children: []
                        }]
                    }
    
                ]
            }
        ]
    }
    
    
    let given = 4;

    if (myObject.key !== given) {
      myObject = searchChild(myObject, given)
    } else {
      myObject = {}
    }

    function searchChild(parent, given) {
        parent.children.map(child => {
          return child.children.filter(item => {
            if (item.key === given) return item;
            else if (item.key !== given 
                && child.children.length > 0 
                && child.children != undefined) { 
                  searchChild(child.children, given);
            }
          })
        })
      }

В настоящее время я получаю ошибку типа при запуске рекурсивной функции.

Вывод должен выглядеть так, как ключи обновляются до нового порядка вдерево:

{
        key: 1,
        name: 'hello',
        children: [
            {
                key: 2,
                name: 'world',
                children: []
            },
            {
                key: 3,
                name: 'hope',
                children: [
                    {
                        key: 4,
                        name: 'having',
                        children: [{
                            key: 5,
                            name: 'fun',
                            children: []
                        }]
                    }

                ]
            }
        ]
    }

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Вот функция, которую вы можете вызвать для своего объекта

function searchInChild(parent,key){
      parent.children = parent.children.filter((c)=>{
        if(key == c.key ){
          result  = c;
          return false;
        }
        return true;
      });

      if(result == null){
        for(c in parent.children){
          searchInChild(parent.children[c],key);
        }
      }

    }

Где вы можете просто передать searchInChild (myObject, key) и сделать результат глобальной переменной.

0 голосов
/ 20 апреля 2019

Вы передаете child.children, но вы должны передать child, вы уже перебрали children в функции.

let myObject = {
        key: 1,
        name: 'hello',
        children: [
            {
                key: 2,
                name: 'world',
                children: []
            },
            {
                key: 3,
                name: 'hope',
                children: [
                    {
                        key: 4,
                        name: 'you',
                        children: [{
                            key: 5,
                            name: 'are',
                            children: []
                        }]
                    },
                    {
                        key: 6,
                        name: 'having',
                        children: [{
                            key: 7,
                            name: 'fun',
                            children: []
                        }]
                    }
    
                ]
            }
        ]
    }
    
    
    let given = 4;

    if (myObject.key !== given) {
      myObject = searchChild(myObject, given)
    } else {
      myObject = {}
    }

    function searchChild(parent, given) {
        if(parent && parent.children) {
parent.children.map(child => {
          return child.children.filter(item => {
            if (item.key === given) return item;
            else if (item.key !== given 
                && child.children.length > 0 
                && child.children != undefined) { 
                  searchChild(child, given);
            }
          })
        })
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...