Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何遍历树结构并仅返回某些值_Javascript_Reactjs_Recursion - Fatal编程技术网

Javascript 如何遍历树结构并仅返回某些值

Javascript 如何遍历树结构并仅返回某些值,javascript,reactjs,recursion,Javascript,Reactjs,Recursion,标题说明了这一切,我目前正在努力解决这个问题,我有一个类似这样的数组: 我拥有的 [ { "label": "X-1", "checked": false, "value": 1, "children": [ { "label": "X-1-1", "checked&q

标题说明了这一切,我目前正在努力解决这个问题,我有一个类似这样的数组:

我拥有的

[
  {
    "label": "X-1",
    "checked": false,
    "value": 1,
    "children": [
      {
        "label": "X-1-1",
        "checked": false,
        "value": 11,
        "isOperation": true,
        "children": []
      },
      {
        "label": "X-1-2",
        "checked": false,
        "value": 12,
        "isOperation": true,
        "children": []
      },
      {
        "label": "X-1-3",
        "checked": false,
        "value": 13,
        "children": [
          {
            "label": "X-1-3-1",
            "checked": false,
            "value": 131,
            "isOperation": true,
            "children": []
          },
          {
            "label": "X-1-3-2",
            "checked": true,
            "value": 132,
            "isOperation": true,
            "children": []
          },
          {
            "label": "X-1-3-3",
            "checked": false,
            "value": 1313,
            "children": []
          }
        ]
      }
    ]
  },
  {
    "label": "X-2",
    "checked": true,
    "value": 2,
    "children": [
      {
        "label": "X-2-1",
        "checked": true,
        "value": 21,
        "children": []
      }
    ]
  }
]
我必须只返回选中了
的值:true
,结构如下:

我必须返回的内容

[
  {
    "TransactionId": 1312,
    "Description": "X-1-3-2",
    "TransactionChild": []
  },
  {
    "TransactionId": 2,
    "Description": "X-2",
    "TransactionChild": [
      {
        "TransactionId": "21",
        "Description": "X-2-1"
      }
    ]
  }
]
根据要求,我目前所拥有的

const convertTreeDataToTransactionSelected = (node: TreeNodeProps[]): TreeItem[] => {
    let treeData: TreeItem[] = [];
    if (node.length > 1) {
      treeData = node.map(el => {
        return {
          Description: el.label,
          TransactionId: Number(el.value),
          TransactionChild: el.children ? convertTreeDataToTransactionSelected(el.children) : [],
        };
      });
    }
    return treeData;
};
我怎样才能做到这一点?(是的,我知道最好的方法是使用递归,但我未能获得所需的返回值

请记住,如果选中了所有
子项
,则也会选中父项(同样,如果选中了
父项
,则表示也选中了所有
子项


提前感谢

您可以使用两个函数获取嵌套节点,另一个函数获取与所需约束匹配的根节点或起始节点

要更改属性,可以添加包装器,但这并不比获得总体功能更重要

const
getNestedNodes=(子节点,cb)=>q=>{
if(cb(q)){
return[{…q,children:q.children.flatMap(getNestedNodes(children,cb))}]
}否则{
push(…getNodes(q.children,cb));
返回[];
}
},
getNodes=(data,cb)=>data.flatMap(o=>{
如果(cb(o)){
const children=[];
返回[
{…o,children:o.children.flatMap(getNestedNodes(children,cb))},
儿童
];
}否则{
返回getNodes(o.children,cb);
}
}),
数据=[{label:“X-1”,选中:false,值:1,子项:[{label:“X-1-1”,选中:false,值:11,等操作:true,子项:[},{label:“X-1-2”,选中:false,值:false,值:true,子项:[{label:“X-1-3”,选中:false,值:13,子项:[{label:“X-1-3-1”,选中:false,值:131,等操作:true,子项:[]},{label:“X-1-3-2”,选中:true,值:132,等操作:true,子项:[]},{label:“X-1-3-3”,选中:false,值:1313,子项:[{label:“X-1-3-3-1”,选中:true,值:1331,子项:[]}]},{label:“X-2”,选中:true,值:2,子项:[label:“X-2-1”,选中:true,值:21,子项:[{label:“X-2-1-1”,选中:false,值:211,子项:[{label:“X-2-1-1-1”,选中:true,值:2111,子项:[]}]},
结果=getNodes(数据,({checked})=>checked);
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
既然您接受了Nina Scholz的答案,我假设输出格式就是您想要的格式,即匹配的树的所有元素都以平面数组的形式返回

但是如果您感兴趣,这里有一种替代形式,它保持树结构不变,返回所有匹配的节点及其所有祖先

constdeepfilter=(pred)=>(xs)=>
flatMap({children=[],…rest},{,},{,children=deepFilter(pred)(children))=>
pred(rest)| | kids.length
?[{…休息,…(kids.length?{children:kids}:{}]
: []
)
const keepChecked=deepFilter(x=>x.checked)
常量输入=[{label:“X-1”,选中:false,值:1,子项:[{label:“X-1-1”,选中:false,值:11,等操作:true,子项:[},{label:“X-1-2”,选中:false,值:12,等操作:true,子项:[},{label:“X-1-3”,选中:false,值:13,子项:[{label:“X-1-3-1”,选中:false,值:131,等操作:true,子项:[]},{label:“X-1-3-2”,选中:true,值:132,等操作:true,子项:[]},{label:“X-1-3-3”,选中:false,值:1313,子项:[]},{label:“X-2”,选中:true,值:2,子项:[{label:“X-2-1”,选中:true,值:21,子项:[]}]
console.log(keepChecked(输入))

.as console wrapper{max height:100%!important;top:0}
考虑使用递归函数吗?能否显示您迄今为止尝试过的递归函数?@AaronMorefield将代码添加到问题中
1312
来自何处以及原因?请注意,如果数组中只有一个节点,则函数返回空数组。不知道为什么。也没有检查
checked
属性是否为true或false。