Как искать / фильтровать / подбирать совпадения через динамически создаваемый многомерный массив - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь найти / отфильтровать многомерный массив, который варьируется по количеству измерений (поскольку он представляет дерево файлов) по его значению name с помощью метода фильтра ES6, но изо всех сил пытается вернуть вложенные объекты.

Как выглядит массив:

const fileHierarchy = [
  {
    name: 'folder1',
    children: [
        { name: 'file1.txt' },
        { name: 'file2.txt' },
        {
            name: 'child folder1',
            children: [
                {
                    name: 'child folder2',
                    children: [
                        { name: 'file3.txt' },
                        { name: 'file4.txt' }
                    ]
                },
                { name: 'file5.txt' },
                { name: 'file6.txt' },
                {
                    name: 'child folder3',
                    children: [
                        { name: 'file7.txt' },
                        { name: 'file8.txt' }
                    ]
                }
            ]
        }
    ]
  },
  {name: 'folder2'}
]

Это то, что я уже пробовал (и как выглядит мой массив / объект):

let currentFileHierarchy;
let searchString = 'file5';

currentFileHierarchy = fileHierarchy.filter(function (item) {
    return item.name.toLowerCase().indexOf(searchString.toLowerCase()) >= 0 
});

Результат currentFileHierarchy является только одномерным (только folder1 и folder2 доступны для поиска), но он также должен включать все вложенные объекты, соответствующие строке поиска.

Если есть способ управления, можно ли также поддерживать структуру массива? Или мне сначала нужно его сплющить?

1 Ответ

2 голосов
/ 25 марта 2019

Сначала сгладьте массив, чтобы получить список имен:

function flatten(names, arr) {
  arr.forEach((item) => {
    names.push(item.name);
    if (item.children) {
      flatten(names, item.children);
    }
  });
  return names;
}

var results = [];
flatten(results, fileHierarchy);

// 'results' has all the names now

Использовать массив results для фильтрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...