我试图在网格中编写一个过滤器,用于捕获所有null,undefined,空字符串或其他类似值,并显示一个短划线" - "。到目前为止,我已经写了以下内容,但它没有捕获空值,我想知道是否可以更简洁,可能重构以避免三层嵌套的if / else语句。需要检查它们的百分比值是否超过0且低于1.此外,负数和0应该按原样返回。谢谢!
angular.module('AdverseEventsExplorer.main').filter('emptyCellFilter', function ($filter) {
return function (input, cellFilter, args1, args2) {
if (cellFilter == undefined) {
return (angular.isNumber(input) || angular.isDefined(input) && input.length > 0) ? input : '-';
} else {
if (cellFilter.match(/pctg|percent|pctgFilter|incidence/ig)) {
return (input > 0 && input < 1.0000000) ? $filter(cellFilter)(input, args1, args2) : '-';
} else {
return (angular.isNumber(input) || angular.isDefined(input) && input.length > 0) ? input : '-';
}
}
};
});
版本2.0考虑到@ tymeJV的评论:
angular.module('AdverseEventsExplorer.main').filter('emptyCellFilter', function ($filter) {
return function (input, cellFilter, args1, args2) {
if (!cellFilter) {
return (angular.isNumber(input) || (input)) ? input : '-';
} else {
if (cellFilter.match(/pctg|percent|pctgFilter|incidence/ig)) {
return (input > 0 && input < 1.0000000) ? $filter(cellFilter)(input, args1, args2) : '-';
} else {
return (angular.isNumber(input) || (input)) ? $filter(cellFilter)(input, args1, args2) : '-';
}
}
};
});
答案 0 :(得分:3)
每当遇到一个过于复杂而不能重构的函数时,请尝试将一些较小的语句提取到简洁命名的变量中。它使我们的大脑更容易跟踪功能的要求,并且对于阅读代码的新开发者来说,它也更具可读性。
var inputHasValue = angular.isNumber(input) || input;
if(!inputHasValue){
return '-';
}
if (!cellFilter) {
return input;
}
var isPercentageCell = cellFilter.match(/pctg|percent|pctgFilter|incidence/ig);
var valueIsInRange = input > 0 && input < 1;
if(!isPercentageCell || valueIsInRange){
return $filter(cellFilter)(input, args1, args2);
}
return '-';
答案 1 :(得分:1)
typeof x ==='number' || !!x
当x为null,未定义或空字符串时,为false
只有一种情况不起作用 - 如果你需要过滤布尔变量,但你的情况似乎并不需要它。
无论如何,你可以使用
typeof x === 'boolean' || typeof x ==='number' || !!x