Фильтровать вложенный JSON на основе двух условий - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть вложенный массив json, как показано ниже:

[  
   {  
      "filename":"Vegetable",
      "children":[  
         {  
            "filename":"Juicy",
            "children":[  
               {  
                  "filename":"Tomato",
                  "type":"ts1"
               },
               {  
                  "filename":"Carrot",
                  "type":"ts2"
               },
               ,
               {  
                  "filename":"Onion",
                  "type":"ts3"
               }
            ]
         },
         {  
            "filename":"Sweet",
            "children":[  
               {  
                  "filename":"Potato",
                  "type":"ts4"
               },
               {  
                  "filename":"Water melon",
                  "type":"ts"
               }
            ]
         }
      ]
   },
   { filename:"Fruits"..........
   },....
]

Мне нужно отфильтровать массив так, чтобы выполнялись следующие условия:

  1. Имя файла = сочные данные (это может быть и Сладкий, я имею в виду, что 2-й уровень массива)
  2. Под этим будет текст фильтра, предположим, что это 't'. Тогда он должен соответствовать именам файлов Tomato, Carrot, поскольку он содержит t

Основы на условиях ниже ожидаемого результата

[  
   {  
      "filename":"Vegetable",
      "children":[  
         {  
            "filename":"Juicy",
            "children":[  
               {  
                  "filename":"Tomato",
                  "type":"ts1"
               },
               {  
                  "filename":"Carrot",
                  "type":"ts2"
               }
            ]
         },
         {  
            "filename":"Sweet",
            "children":[  
               {  
                  "filename":"Potato",
                  "type":"ts4"
               },
               {  
                  "filename":"Water melon",
                  "type":"ts"
               }
            ]
         }
      ]
   },
   { filename:"Fruits"..........
   },....
]

т. Е. Оно должно уничтожить

{  "filename":"Onion",
   "type":"ts3"
 }

Так как лук не содержит 't'.

Я пробовал с фильтром, отображать с использованием функций стрелок, но не работал, как ожидалось.

Я попробовал функцию filterby =(childname, filterText).filter =>{...}

Пожалуйста, ведите меня ...

1 Ответ

2 голосов
/ 02 апреля 2019

Я пришел с одним решением, которое использует два вложенных Array.map () и Array.filter () на последнем уровне детей:

const input = [  
 {  
   "filename":"Vegetable",
   "children":[  
     {  
       "filename":"Juicy",
       "children":[  
         {"filename":"Tomato", "type":"ts1"},
         {"filename":"Carrot", "type":"ts2"},
         {"filename":"Onion", "type":"ts3"}
       ]
     },
     {  
       "filename":"Sweet",
       "children":[  
         {"filename":"Potato", "type":"ts4"},
         {"filename":"Water melon", "type":"ts"}
       ]
     }
   ]
 },
 {
   "filename":"Fruits",
   "children": []
 }
];

const filterBy = (arr, childname, filterText) =>
{
    return arr.map(({filename, children}) =>
    {
        return {filename, children: children.map(({filename, children}) =>
        {
           if (filename === childname)
               return {filename, children: children.filter(
                   x => x.filename.match(filterText)
               )};
           else
               return {filename, children};
        })};
    });
}

console.log(
  "Filter the Juits by text 't': ",
  filterBy(input, "Juicy", "t")
);

console.log(
  "Filter the Sweet by text 'r': ",
  filterBy(input, "Sweet", "r")
);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...