Javascript 此函数';s圈复杂度太高。(38)
我的过滤器有一个switch case语句。 但它给我带来了复杂的问题,你能帮我解决吗 下面是我的示例代码。它包括更多的案例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) {
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;