Нажав на стену с этой, подумал, что я отправлю ее здесь, если какая-то душа встретит подобную. У меня есть некоторые данные, которые выглядят примерно так:
const input = [
{
value: 'Miss1',
children: [
{ value: 'Miss2' },
{ value: 'Hit1', children: [ { value: 'Miss3' } ] }
]
},
{
value: 'Miss4',
children: [
{ value: 'Miss5' },
{ value: 'Miss6', children: [ { value: 'Hit2' } ] }
]
},
{
value: 'Miss7',
children: [
{ value: 'Miss8' },
{ value: 'Miss9', children: [ { value: 'Miss10' } ] }
]
},
{
value: 'Hit3',
children: [
{ value: 'Miss11' },
{ value: 'Miss12', children: [ { value: 'Miss13' } ] }
]
},
{
value: 'Miss14',
children: [
{ value: 'Hit4' },
{ value: 'Miss15', children: [ { value: 'Miss16' } ] }
]
},
];
Во время выполнения я не знаю, насколько глубока иерархия, т.е. сколько уровней объектов будет иметь дочерний массив. Я несколько упростил этот пример, мне действительно нужно будет сопоставить свойства значений с массивом поисковых терминов. Пусть на данный момент предположим, что я сопоставляю, где value.includes('Hit')
.
Мне нужна функция, которая возвращает новый массив, например:
-
В объекте вывода
не должен существовать любой объект, не соответствующий совпадению, без дочерних элементов или без совпадений в иерархии детей. -
Каждый объект с потомком, который содержит соответствующий объект, должен оставаться
-
Все потомки совпадающих объектов должны оставаться
Я рассматриваю "соответствующий объект" как единое целое с свойством value
, которое в этом случае содержит строку Hit
, и наоборот.
Результат должен выглядеть примерно так:
const expected = [
{
value: 'Miss1',
children: [
{ value: 'Hit1', children: [ { value: 'Miss3' } ] }
]
},
{
value: 'Miss4',
children: [
{ value: 'Miss6', children: [ { value: 'Hit2' } ] }
]
},
{
value: 'Hit3',
children: [
{ value: 'Miss11' },
{ value: 'Miss12', children: [ { value: 'Miss13' } ] }
]
},
{
value: 'Miss14',
children: [
{ value: 'Hit4' },
]
}
];
Большое спасибо всем, кто потратил время на то, чтобы прочитать это, опубликует мое решение, если я получу его первым.