首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于给定搜索项的未知深度嵌套对象数组的过滤

基于给定搜索项的未知深度嵌套对象数组的过滤
EN

Stack Overflow用户
提问于 2022-05-06 17:15:32
回答 1查看 348关注 0票数 0

这里有类似的答案,但我看到和测试过的所有答案都没有达到两个层次,所以我不认为这是一个重复的问题.我正在尝试过滤一个对象数组。每个对象都可以有其他深度未知的嵌套对象。对于我的数据,treeViewtreeData的集合,treeNode(子)将具有相同的接口。

代码语言:javascript
复制
export interface TreeView = TreeData[]

export interface TreeData {
    label: string;
    children?: TreeData[]
}
代码语言:javascript
复制
const treeData = 
[
  {label: 'obj-1', children: [ {label: 'bananas'},{label: 'apples', children: [
       {label: 'bananas',},{label: 'apples'}, {label: 'coconut',  children: [
           {label: 'bananas'},{label: 'oranges',  },
]},
]}]},
  
{label: 'obj-2', children: [ {label: 'apples'},{label: 'apples', children: [
       {label: 'oranges',},{label: 'apples'}, {label: 'coconut',  children: [
           {label: 'bananas'},{label: 'oranges', children: [
             {label: 'bananas'},{label: 'oranges',  },
] },
]},
]}]},

  {label: 'obj-3', children: [ {label: 'apples'},{label: 'mango'},{label: 'apples', children: [
       {label: 'oranges',},{label: 'apples'}, {label: 'coconut',  children: [
           {label: 'bananas'},{label: 'oranges', children: [
             {label: 'bananas'},{label: 'mango',  },
] },
]},
]}]},
]

应该删除带有与searchTerm不匹配的标签的对象,如果对象具有子属性,则重复该过程。我一直试图用递归来解决这个问题。这是我的密码。

代码语言:javascript
复制
const recurse = (array, searchTerm) => {
  return array.map((element) => {
  return {...element, subElements: element.subElements.filter((subElement) => subElement.label === searchTerm)}
})
}

const filterArray = (myArray,value) => {
  for(let i = 0; i < myArray.length;i++){
    if(myArray.children){
      if(myArray[i].children){
          filterArray(myArray[i].children,value) 
        }
    }
    } 
     recurse(myArray,value)
  }


console.log(filterArray(treeData,'bananas'))

在上面的示例中,搜索‘香蕉’将尽可能深地过滤整个数组,删除标签支柱不等于香蕉的任何对象;如果一个对象没有子对象,它的标签支柱是否等于搜索项,如果不是从其父数组中删除它。提前谢谢你!

我想返回原始array.Only对象的过滤版本,其标签将显示为“香蕉”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-06 17:48:01

我想你会想要这样的东西:

代码语言:javascript
复制
const filterByLabel = (array, searchTerm) => {
    return array.reduce((prev, curr) => {
        const children = curr.children ? filterByLabel(curr.children, searchTerm) : undefined;
        
        return curr.label === searchTerm || children?.length > 0 ? [...prev, { ...curr, children }] : prev;
    }, []);
}

filterByLabel(treeData, 'bananas');
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72145230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档