Javascript 与递归斗争-函数在过滤对象数组时返回空数组

Javascript 与递归斗争-函数在过滤对象数组时返回空数组,javascript,arrays,object,recursion,Javascript,Arrays,Object,Recursion,我有以下递归函数: const findChildren = (id, array) => { const matchingItems = array.filter(arrayItem => { if (arrayItem.children) { findChildren(id, arrayItem.children) } return arrayItem.item.parent === id; })

我有以下递归函数:

const findChildren = (id, array) => {
   const matchingItems = array.filter(arrayItem => {
       if (arrayItem.children) {
          findChildren(id, arrayItem.children)
       }
   
       return arrayItem.item.parent === id;
   })
     
   return matchingItems;
}
我试图只找到具有相同的
parent
属性的元素,这些属性等于我作为参数传递给函数的
id
。这是我正在处理的对象数组:

const data = [
  {
    "item": {
      "id": 0,
      "name": "aaa"
    },
    "children": [
      {
        "item": {
          "id": 1,
          "name": "bbb",
          "parent": 0
        }
      },
      {
        "item": {
          "id": 2,
          "name": "ccc",
          "parent": 0
        }
      }
    ]
  },
  {
    "item": {
      "id": 3,
      "name": "ddd"
    },
    "children": [
      {
        "item": {
          "id": 4,
          "name": "eee",
          "parent": 3
        }
      },
      {
        "item": {
          "id": 5,
          "name": "fff",
          "parent": 3
        },
        "children": [
          {
            "item": {
              "id": 6,
              "name": "ggg",
              "parent": 5
            }
          }
        ]
      }
    ]
  },
  {
    "item": {
      "id": 7,
      "name": "hhh"
    },
    "children": [
      {
        "item": {
          "id": 8,
          "name": "iii",
          "parent": 7
        },
        "children": [
          {
            "item": {
              "id": 9,
              "name": "jjj",
              "parent": 8
            },
            "children": [
              {
                "item": {
                  "id": 10,
                  "name": "kkk",
                  "parent": 9
                }
              },
              {
                "item": {
                  "id": 11,
                  "name": "lll",
                  "parent": 9
                }
              },
              {
                "item": {
                  "id": 12,
                  "name": "mmm",
                  "parent": 9
                }
              }
            ]
          },
          {
            "item": {
              "id": 13,
              "name": "nnn",
              "parent": 8
            },
            "children": [
              {
                "item": {
                  "id": 14,
                  "name": "ooo",
                  "parent": 13
                }
              },
              {
                "item": {
                  "id": 15,
                  "name": "ppp",
                  "parent": 13
                }
              },
              {
                "item": {
                  "id": 16,
                  "name": "qqq",
                  "parent": 13
                }
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "item": {
      "id": 17,
      "name": "rrr"
    },
    "children": [
      {
        "item": {
          "id": 18,
          "name": "sss",
          "parent": 17
        }
      },
      {
        "item": {
          "id": 19,
          "name": "ttt",
          "parent": 17
        },
        "children": [
          {
            "item": {
              "id": 20,
              "name": "uuu",
              "parent": 19
            }
          },
          {
            "item": {
              "id": 21,
              "name": "vvv",
              "parent": 19
            }
          }
        ]
      },
      {
        "item": {
          "id": 22,
          "name": "www",
          "parent": 17
        }
      },
      {
        "item": {
          "id": 23,
          "name": "xxx",
          "parent": 17
        },
        "children": [
          {
            "item": {
              "id": 24,
              "name": "yyy",
              "parent": 23
            }
          },
          {
            "item": {
              "id": 25,
              "name": "zzz",
              "parent": 23
            }
          }
        ]
      }
    ]
  }
]

当像这样调用函数时,我得到
未定义的

console.log(findChildren(3, data));

我尝试使用
映射
查找
,结果总是
未定义
。我用尽了所有的想法,真的在与递归作斗争。任何帮助都将不胜感激。谢谢。

处理递归的方法有很多种,例如,我只使用了一种方法

您遇到的问题是,您没有将子结果添加到任何位置,您只是对其进行过滤

在下面的示例中,我使用一个side对象来收集所有子级结果

const数据=[{
“项目”:{
“id”:0,
“名称”:“aaa”
},
“儿童”:[{
“项目”:{
“id”:1,
“名称”:“bbb”,
“家长”:0
}
},
{
“项目”:{
“id”:2,
“名称”:“ccc”,
“家长”:0
}
}
]
},
{
“项目”:{
“id”:3,
“名称”:“ddd”
},
“儿童”:[{
“项目”:{
“id”:4,
“名称”:“eee”,
“家长”:3
}
},
{
“项目”:{
“id”:5,
“名称”:“fff”,
“家长”:3
},
“儿童”:[{
“项目”:{
“id”:6,
“名称”:“ggg”,
“家长”:5
}
}]
}
]
},
{
“项目”:{
“id”:7,
“名称”:“hhh”
},
“儿童”:[{
“项目”:{
“id”:8,
“名称”:“iii”,
“家长”:7
},
“儿童”:[{
“项目”:{
“id”:9,
“名称”:“jjj”,
“家长”:8
},
“儿童”:[{
“项目”:{
“id”:10,
“名称”:“kkk”,
“家长”:9
}
},
{
“项目”:{
“id”:11,
“名称”:“lll”,
“家长”:9
}
},
{
“项目”:{
“id”:12,
“姓名”:“嗯”,
“家长”:9
}
}
]
},
{
“项目”:{
“id”:13,
“名称”:“nnn”,
“家长”:8
},
“儿童”:[{
“项目”:{
“id”:14,
“名称”:“ooo”,
“家长”:13
}
},
{
“项目”:{
“id”:15,
“名称”:“ppp”,
“家长”:13
}
},
{
“项目”:{
“id”:16,
“名称”:“qqq”,
“家长”:13
}
}
]
}
]
}]
},
{
“项目”:{
“id”:17,
“名称”:“rrr”
},
“儿童”:[{
“项目”:{
“id”:18,
“名称”:“sss”,
“家长”:17
}
},
{
“项目”:{
“id”:19,
“名称”:“ttt”,
“家长”:17
},
“儿童”:[{
“项目”:{
“id”:20,
“名称”:“uuu”,
“家长”:19
}
},
{
“项目”:{
“id”:21,
“名称”:“vvv”,
“家长”:19
}
}
]
},
{
“项目”:{
“id”:22,
“名称”:“www”,
“家长”:17
}
},
{
“项目”:{
“id”:23,
“名称”:“xxx”,
“家长”:17
},
“儿童”:[{
“项目”:{
“id”:24,
“名称”:“yyy”,
“家长”:23
}
},
{
“项目”:{
“id”:25,
“名称”:“zzz”,
“家长”:23
}
}
]
}
]
}
]
常量findChildren=(id,数组)=>{
var matchingItems=[];
常量currentItems=array.filter(arrayItem=>{
if(阵列项目子项){
const childrenItems=findChildren(id,arrayItem.children);
如果(childrenItems.length>0){
匹配项。推送(…子项);
}
}
返回arrayItem.item.parent==id;
})
如果(currentItems.length>0){
匹配项。推送(当前项);
}
返回匹配项;
}

日志(findChildren(3,数据))我将在一个可重用函数的基础上构建这个函数,该函数遍历子对象,收集与谓词匹配的对象。可能是这样的:

const collect=(pred)=>(xs=[])=>
xs.flatMap(x=>[
…(pred(x)?[x]:[]),
…收集(pred)(x.儿童)
])
const findChildren=(id,数据)=>
收集(({item:{parent}})=>parent==id)(数据)
const data=[{item:{id:0,名称:“aaa”},子项:[{item:{id:1,名称:“bbb”,父项:0}},{item:{id:2,名称:“ccc”,父项:0}}]},{item:{id:3,名称:“ddd”},子项:[{item:{id:4,名称:“eee”,父项:3},{item:{id:5,名称:“fff”,父项:3},子项:{{item:{id:6,父项:{hhhhg:},{,子项:{item:{id:8,名称:“iii”,父项:7},子项:{item:{id:9,名称:“jjj”,父项:8},子项:{item:{id:10,名称:“kkk”,父项:9},{item:{id:11,名称:“lll”,父项:9},{item:{item:{id:12,名称:“mmm”,父项:9}},子项:{id:13,名称:“nnn”,父项:8},子项:{id:11,父项:14,父项:13}{id:15,名称:“ppp”,父项:13},{item:{id:16,名称:“qqq”,父项:13}}}]}]},{item:{id:17,名称:“rrr”},子项:[{item:{id:18,名称:“sss”