前端大佬们,这段代码如何优化?
const getSelectedChildFacets = function (parent) {
parent?.childrens?.forEach((child) => {
if (child.selected && !child.partiallySelected) {
// 如果是全选
if (parentValues.includes(child.value)) {
// 如果是父节点,非子节点则继续向下查找
getSelectedChildFacets(child);
} else {
// 如果是子节点,则存起来
arrSelectedFacets.push(child.value);
}
} else if (child.selected && child.partiallySelected) {
// 如果是半选,则继续向下查找
getSelectedChildFacets(child);
}
});
};
arrFacetValues.forEach((parent) => {
if (parent.selected && !parent.partiallySelected) {
// 全选
if (parentValues.includes(parent.value)) {
// 全选且是父节点,向下查找
getSelectedChildFacets(parent);
} else {
// 子节点则存到树组中
arrSelectedFacets.push(parent.value);
}
}
if (parent.selected && parent.partiallySelected) {
// 如果是半选,继续向下查找
getSelectedChildFacets(parent);
}
});
如何将两个方法合并成一个方法如图parentValues = ['BC', 'BC-SRV', 'BC-SRV-COM'],想得到的是选中的树组arrSelectedFacets = ['BC-SRV-COM-FTP', 'BC-SRV-COM-TEL']
const arrFacetValues = [
{
value: "BC",
selected: true,
partiallySelected: true,
childrens: [
{
value: "BC-SRV",
selected: true,
partiallySelected: true,
childrens: [
{
value: "BC-SRV-COM",
selected: true,
partiallySelected: true,
childrens: [
{
value: "BC-SRV-COM-FTP",
selected: true,
partiallySelected: false,
childrens: [],
},
{
value: "BC-SRV-COM-TEL",
selected: true,
partiallySelected: false,
childrens: [],
},
],
}
],
}
],
}
]
如果 BC-SRV-COM 下的子节点都选中,则arrSelectedFacets=['BC-SRV-COM']
回复
1个回答

test
2024-06-28
const getSelectedChildFacets = function (node, parentValues, arrSelectedFacets) {
if (node.selected) {
if (!node.partiallySelected && !parentValues.includes(node.id)) {
arrSelectedFacets.push(node.id);
} else {
node.childrens.forEach((child) => {
getSelectedChildFacets(child, parentValues, arrSelectedFacets);
});
}
}
};
const parentValues = ['BC', 'BC-SRV', 'BC-SRV-COM'];
const arrSelectedFacets = [];
const arrFacetValues = [
{
id: "BC",
selected: true,
partiallySelected: true,
childrens: [
{
id: "BC-SRV",
selected: true,
partiallySelected: true,
childrens: [
{
id: "BC-SRV-COM",
selected: true,
partiallySelected: true,
childrens: [
{
id: "BC-SRV-COM-FTP",
selected: true,
partiallySelected: false,
childrens: [],
},
{
id: "BC-SRV-COM-TEL",
selected: true,
partiallySelected: false,
childrens: [],
},
],
}
],
}
],
}
];
arrFacetValues.forEach((parent) => {
getSelectedChildFacets(parent, parentValues, arrSelectedFacets);
});
console.log(arrSelectedFacets); // ['BC-SRV-COM-FTP', 'BC-SRV-COM-TEL']
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容