根据输入值过滤未知的深层嵌套数组

Filter unknown deep nested array based on input value

首先,如果这个问题已经得到回答,我必须说抱歉,但我还没有找到我正在寻找的答案:(

我有一个嵌套深度未知的对象数组(可以是 20-30 甚至更多),我想根据输入字段值过滤它 'name' 属性。

public nestedArray = [
  {id: 1, name: 'Example_1', children: []},
  {id: 2, name: 'Test', children: []},
  {id: 3, name: 'Test Name', children: [
    {id: 10, name: 'Child name', children: [
      {id: 20, name: 'Example_14', children: []},
      {id: 30, name: 'Last Child', children: []}
        ]
      }
    ]
  }
];

我想要接收的结果是一个只有一层深度的对象数组,其中包含输入值的 'name' 字段。 例如我的输入值是'am',所以结果是:

resultsArray = [
  {id: 1, name: 'Example_1'},
  {id: 3, name: 'Test Name'},
  {id: 10, name: 'Child name'},
  {id: 20, name: 'Example_14'}
];

像这样在第一层做是没有问题的:

public filter(array: any[], input_value: string): void {
  array = array.filter(el => {
    return el.name.toLowerCase().includes(input_value.toLowerCase()));
  }
}

提前致谢!

您可以映射数组及其子数组,并获取字符串与 name 属性.

匹配的对象的平面结果

const
    find = value => ({ children, ...o }) => [
        ...(o.name.includes(value) ? [o] : []),
        ...children.flatMap(find(value))
    ],
    data = [{ id: 1, name: 'Example_1', children: [] }, { id: 2, name: 'Test', children: [] }, { id: 3, name: 'Test Name', children: [{ id: 10, name: 'Child name', children: [{ id: 20, name: 'Example_14', children: [] }, { id: 30, name: 'Last Child', children: [] }] }] }],
    result = data.flatMap(find('am'));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

具有单一结果数组和经典方法的另一种解决方案。

const
    find = (array, value) => {
        const
            iter = array => {
                for (const { children, ...o } of array) {
                    if (o.name.includes(value)) result.push(o);
                    iter(children);
                }
            },
            result = [];

        iter(array);
        return result;
    },
    data = [{ id: 1, name: 'Example_1', children: [] }, { id: 2, name: 'Test', children: [] }, { id: 3, name: 'Test Name', children: [{ id: 10, name: 'Child name', children: [{ id: 20, name: 'Example_14', children: [] }, { id: 30, name: 'Last Child', children: [] }] }] }],
    result = find(data, 'am');

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }