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”