前端大佬们,这段代码如何优化?

作者站长头像
站长
· 阅读数 17
    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个回答
avatar
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']
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容