Отфильтровывать вложенный объект от родительского объекта

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

У меня есть родительский объект с дочерним массивом вложенных объектов. Каждый объект содержит id ключ с уникальным значением. Функция фильтра должна искать родительский объект для an 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 
                amp;amp; child.children.length > 0 
                amp;amp; 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: []
                        }]
                    }

                ]
            }
        ]
    }
 

Комментарии:

1. searchChild никогда не возвращает определенное значение и не изменяет его аргументы. Он должен сделать одну из этих вещей. Какого из них вы ожидали?

Ответ №1:

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

 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) и сделать результат глобальной переменной.

Ответ №2:

Вы проходите 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 amp;amp; parent.children) {
parent.children.map(child => {
          return child.children.filter(item => {
            if (item.key === given) return item;
            else if (item.key !== given 
                amp;amp; child.children.length > 0 
                amp;amp; child.children != undefined) { 
                  searchChild(child, given);
            }
          })
        })
      }
} 

Комментарии:

1. Ах, да! Это отличное начало, но лишь частичный ответ на вопрос.