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

    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);
            }
        });

如何将两个方法合并成一个方法
image.png
如图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']

阅读 2.9k
1 个回答
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']
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题