如何通过动态构建多维数组进行搜索/过滤/类型匹配

时间:2019-03-25 16:49:12

标签: javascript ecmascript-6

我正在尝试使用ES6过滤器方法搜索/过滤多维数组,该多维数组的维数(因为它代表文件树)的name值会有所不同,但还努力返回嵌套对象。 / p>

数组是什么样的:

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的结果仅是一维的(只能搜索folder1folder2,但它还应包括所有与搜索字符串匹配的嵌套对象。

如果有一种管理方法,是否还可以维护阵列结构?还是我需要先将其展平?

1 个答案:

答案 0 :(得分:2)

首先,将数组弄平以获取名称列表:

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数组进行过滤。