глубокий фильтр динамического массива объектов (по строковому свойству) - PullRequest
1 голос
/ 16 октября 2019

Я хочу отфильтровать динамический массив по свойству "name".
Массив имеет 3 вида объектов: "ссылка", "папка" и "приложение".

{
    type: "link",
    name: ""
},
{
    type: "folder",
    name: "",
    childs: []
},
{
    type: "app",
    name: "",
    childs: []
}
  • приложение может иметь только ссылки в качестве детей.
  • папка может иметь все 3 вида (ссылка, папка, приложение) как дочерние.

Если ребенок соответствует поисковому значению, все его родители выживают,(его братья и сестры отфильтровываются, если они не совпадают)


У меня есть массив примерно так:

var items = [
    {
        type: 'app',
        name: 'bar',
        childs: [
            {
                type: 'link',
                name: 'mee'
            }
        ]
    },
    {
        type: 'folder',
        name: 'fizz',
        childs: [
            {
                type: 'link',
                name: 'buzz'
            },
            {
                type: 'app',
                name: 'boo',
                childs: []
            }
        ]
    },
    {
        type: 'folder',
        name: 'bla',
        childs: [
            {
                type: 'app',
                name: 'blee',
                childs: [
                    {
                        type: 'link',
                        name: 'blee'
                    },
                    {
                        type: 'link',
                        name: 'bar'
                    }
                ]
            },
            {
                type: 'folder',
                name: 'mee',
                childs: [
                    {
                        type: 'app',
                        name: 'bar',
                        childs: [
                            {
                                type: 'link',
                                name: 'maa'
                            }
                        ]
                    },
                    {
                        type: 'link',
                        name: 'mee'
                    }
                ]
            }
        ]
    },
    {
        type: 'link',
        name: 'foo',
        childs: [
            {
                type: 'folder',
                name: 'baf',
                childs: []
            }
        ]
    }
];

Мне удалось написать non deep filtering:
https://jsfiddle.net/6ocd5u8y
(я также был бы признателен за любые предложения по этому коду)

Я также нашел код, который фильтрует глубоко, ноподдерживает братьев и сестер соответствующих потомков и фильтрует их по любой строке:
https://jsfiddle.net/ndfu8cpL


результат поиска типа 'bar' должен быть следующим:

filteredArray = [
    {
        type: 'app',
        name: 'bar',
        childs: []
    },
    {
        type: 'folder',
        name: 'bla',
        childs: [
            {
                type: 'app',
                name: 'blee',
                childs: [
                    {
                        type: 'link',
                        name: 'bar'
                    }
                ]
            },
            {
                type: 'folder',
                name: 'mee',
                childs: [
                    {
                        type: 'app',
                        name: 'bar',
                        childs: []
                    }
                ]
            }
        ]
    }
]

Буду очень признателен, если кто-нибудь сможет мне помочь.

1 Ответ

0 голосов
/ 16 октября 2019

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

function filter(array, name) {
    return array.reduce((r, o) => {
        var childs = filter(o.childs || [], name);
        if (o.name === name || childs.length) r.push(Object.assign({}, o, { childs }));
        return r;
    }, []);
}

var items = [{ type: 'app', name: 'bar', childs: [{ type: 'link', name: 'mee' }] }, { type: 'folder', name: 'fizz', childs: [{ type: 'link', name: 'buzz' }, { type: 'app', name: 'boo', childs: [] }] }, { type: 'folder', name: 'bla', childs: [{ type: 'app', name: 'blee', childs: [{ type: 'link', name: 'blee' }, { type: 'link', name: 'bar' }] }, { type: 'folder', name: 'mee', childs: [{ type: 'app', name: 'bar', childs: [{ type: 'link', name: 'maa' }] }, { type: 'link', name: 'mee' }] }] }, { type: 'link', name: 'foo', childs: [{ type: 'folder', name: 'baf', childs: [] }] }];

console.log(filter(items, 'bar'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...