Javascript 此函数';s圈复杂度太高。(38)

Javascript 此函数';s圈复杂度太高。(38),javascript,angularjs,Javascript,Angularjs,我的过滤器有一个switch case语句。 但它给我带来了复杂的问题,你能帮我解决吗 下面是我的示例代码。它包括更多的案例 angular.forEach(docsClone, function(doc) { var added = false; angular.forEach($scope.filterOptions, function(opt) { if (!added) {

我的过滤器有一个switch case语句。 但它给我带来了复杂的问题,你能帮我解决吗

下面是我的示例代码。它包括更多的案例

    angular.forEach(docsClone, function(doc) {
                var added = false;
                angular.forEach($scope.filterOptions, function(opt) {
                    if (!added) {
                        switch (opt.AttributeId) {
                            case 'documentStatus':
                                if ((doc.documentStatus !== undefined && doc.documentStatus !== null && doc.documentStatus.indexOf(opt.AttributeValue) !== -1)) {
                                    filteredDocs.push(doc);
                                    added = true;
                                }
                                break;
                            case 'planStatus':
                                if ((doc.planStatus !== undefined && doc.planStatus.indexOf(opt.AttributeValue) !== -1)) {
                                    filteredDocs.push(doc);
                                    added = true;
                                }
                                break;
                            case 'planFamily':
                                if ((doc.planProductFamily !== undefined && doc.planProductFamily !== null && doc.planProductFamily.indexOf(opt.AttributeValue) !== -1)) {
                                    filteredDocs.push(doc);
                                    added = true;
                                }
                                break;
                            case 'planYear':
                                planYear(doc, opt.AttributeValue, filteredDocs, added);
                                break;
                            case 'documentType':
                                if ((doc.documentType !== undefined && doc.documentType !== null && doc.documentType.indexOf(opt.AttributeValue) !== -1)) {
                                    filteredDocs.push(doc);
                                    added = true;
                                }
                                break;
                            case 'businessEntity':
                                if ((doc.businessEntity !== undefined && doc.businessEntity !== null && doc.businessEntity.indexOf(opt.AttributeValue) !== -1)) {
                                    filteredDocs.push(doc);
                                    added = true;
                                }
                                break;
                            case 'productClass':
                                if ((doc.productClass !== undefined && doc.productClass !== null && doc.productClass !== null && doc.productClass.indexOf(opt.AttributeValue) !== -1) ||
                                    (doc.planProductClass !== undefined && doc.planProductClass.indexOf(opt.AttributeValue) !== -1)) {
                                    filteredDocs.push(doc);
                                    added = true;
                                }
                                break;
                            case 'productType':
                                if ((doc.productType !== undefined && doc.productType !== null && doc.productType.indexOf(opt.AttributeValue) !== -1) ||
                                    (doc.planProductType !== undefined && doc.planProductType.indexOf(opt.AttributeValue) !== -1)) {
                                    filteredDocs.push(doc);
                                    added = true;
                                }
                                break;
    }

我看你有很多共同的条件,为什么不分解成一些共同的条件:

    angular.forEach(docsClone, function(doc) {
      var added = false;
      angular.forEach($scope.filterOptions, function(opt) {
          if (!added) {
              switch (opt.AttributeId) {
                  case 'planStatus':
                      planYear(doc, opt.AttributeValue, filteredDocs, added);
                      break;
                  case 'documentType':
                  case 'documentStatus':
                  case 'planStatus':
                  case 'planFamily':
                      if ((doc[opt.AttributeId] !== undefined && doc[opt.AttributeId] !== null && doc[opt.AttributeId].indexOf(opt.AttributeValue) !== -1)) {
                          filteredDocs.push(doc);
                          added = true;
                      }
                      break;
              }
          }
      });
    }

您可以根据执行的比较/操作来概括您的案例陈述。

谁/什么“抛出”?我敢肯定,Angular并不关心代码的复杂性。首先,将每种情况下的代码提取到函数调用中,就像您在planYear中所做的那样。请注意,许多情况下都会执行完全相同的操作:只有属性发生更改。因此,您可以在一个函数中以属性名为参数重构它
if(doc.documentType!==undefined&&doc.documentType!==null)
可以简化为
if(doc.documentType)
。这可能更适合代码审查。您提到的方法是正确的,但我有两个不同的过滤器,一个用于文档,另一个用于计划。当我把它放在公共位置时,它会破坏evrythng,我需要再次添加更多的案例。示例案例“productClass”:if((doc.productClass!==未定义和&doc.productClass!==null和&doc.productClass!==null和&doc.productClass.indexOf(opt.AttributeValue)!=-1)|(doc.planProductClass!==未定义和&doc.planProductClass.indexOf(opt.AttributeValue)!==-1)){filteredDocs.push(doc);added=true;}break;