这里有类似的答案,但我看到和测试过的所有答案都没有达到两个层次,所以我不认为这是一个重复的问题.我正在尝试过滤一个对象数组。每个对象都可以有其他深度未知的嵌套对象。对于我的数据,treeView是treeData的集合,treeNode(子)将具有相同的接口。
export interface TreeView = TreeData[]
export interface TreeData {
label: string;
children?: TreeData[]
}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不匹配的标签的对象,如果对象具有子属性,则重复该过程。我一直试图用递归来解决这个问题。这是我的密码。
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对象的过滤版本,其标签将显示为“香蕉”

发布于 2022-05-06 17:48:01
我想你会想要这样的东西:
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');https://stackoverflow.com/questions/72145230
复制相似问题