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。