Javascript 如何使用AngularJS筛选器捕获空的、未定义的空值

Javascript 如何使用AngularJS筛选器捕获空的、未定义的空值,javascript,angularjs,if-statement,angularjs-filter,Javascript,Angularjs,If Statement,Angularjs Filter,我正在尝试编写一个过滤器,用于网格中,它将捕获所有null、未定义、空白字符串或其他类似值,并显示一个破折号“-”。到目前为止,我已经编写了以下内容,但它没有捕获空值,我想知道它是否可以更简洁,并且可能进行重构,以避免三层嵌套的if/else语句。需要检查百分比值是否大于0且小于1。此外,负数和0应按原样返回。谢谢 angular.module('AdverseEventsExplorer.main').filter('emptyCellFilter', function ($filter) {

我正在尝试编写一个过滤器,用于网格中,它将捕获所有null、未定义、空白字符串或其他类似值,并显示一个破折号“-”。到目前为止,我已经编写了以下内容,但它没有捕获空值,我想知道它是否可以更简洁,并且可能进行重构,以避免三层嵌套的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 : '-';
            }
        }

    };
});
angular.module('addereeventsexplorer.main').filter('emptyCellFilter',函数($filter){
返回函数(输入、cellFilter、args1、args2){
如果(cellFilter==未定义){
返回(angular.isNumber(输入)| | angular.isDefined(输入)&&input.length>0)?输入:'-';
}否则{
if(cellFilter.match(/pctg |百分比| pctgFilter |发生率/ig)){
返回(输入>0&&input<1.0000000)$filter(cellFilter)(输入,args1,args2):“-”;
}否则{
返回(angular.isNumber(输入)| | angular.isDefined(输入)&&input.length>0)?输入:'-';
}
}
};
});
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) : '-';
            }
        }

    };
});
angular.module('addereeventsexplorer.main').filter('emptyCellFilter',函数($filter){
返回函数(输入、cellFilter、args1、args2){
如果(!cellFilter){
返回(角度.isNumber(输入)| |(输入))?输入:'-';
}否则{
if(cellFilter.match(/pctg |百分比| pctgFilter |发生率/ig)){
返回(输入>0&&input<1.0000000)$filter(cellFilter)(输入,args1,args2):“-”;
}否则{
返回(angular.isNumber(输入)| |(输入))?$filter(cellFilter)(输入,args1,args2):'-';
}
}
};
});

每当遇到过于复杂而无法重构的函数时,请尝试提取一些较小的语句,以简洁地命名变量。它使我们的大脑更容易跟踪函数的需求,也使新开发人员更容易阅读您的代码

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 '-';
var inputHasValue=angular.isNumber(输入)|输入;
如果(!inputHasValue){
返回“-”;
}
如果(!cellFilter){
返回输入;
}
var isPercentageCell=cellFilter.match(/pctg |百分比| pctgFilter |发生率/ig);
var值IsInRange=input>0&&input<1;
如果(!isPercentageCell | |值为InRange){
返回$filter(cellFilter)(输入,args1,args2);
}
返回“-”;

每当遇到过于复杂而无法重构的函数时,请尝试提取一些较小的语句,以简洁地命名变量。它使我们的大脑更容易跟踪函数的需求,也使新开发人员更容易阅读您的代码

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 '-';
var inputHasValue=angular.isNumber(输入)|输入;
如果(!inputHasValue){
返回“-”;
}
如果(!cellFilter){
返回输入;
}
var isPercentageCell=cellFilter.match(/pctg |百分比| pctgFilter |发生率/ig);
var值IsInRange=input>0&&input<1;
如果(!isPercentageCell | |值为InRange){
返回$filter(cellFilter)(输入,args1,args2);
}
返回“-”;
当x为null、未定义或空字符串时为false

只有一种情况下它不起作用——如果您需要过滤布尔变量,但您的情况似乎不需要它

无论如何,在这种情况下,你可以使用

typeof x === 'boolean' || typeof x ==='number' || !!x
当x为null、未定义或空字符串时为false

只有一种情况下它不起作用——如果您需要过滤布尔变量,但您的情况似乎不需要它

无论如何,在这种情况下,你可以使用

typeof x === 'boolean' || typeof x ==='number' || !!x

null
undefined
0
如果(值)
检查,所有falsy值都可以做
检查。
null
undefined
0
所有falsy值都可以做
如果(值)
检查。太棒了,谢谢@Hankio。现在我有一些列,我希望能够显示0和负值,您认为捕捉这些场景的最佳方式是什么?看起来我可能需要显式地处理这些值或使用不同的cellFilter。当你说你想“显示”这些值时,你是什么意思?按原样显示它们(即
返回输入;
)或返回由cellFilter过滤的它们?您可以在此函数中区分
valueIsInRange
valueIsInPercentRange
。如果不知道要用它做什么,很难说。什么决定了你是否要在某些单元格中显示“0和负值”,而不是在其他单元格中?按原样显示它们(返回输入),此时,决定我们要按原样返回0和负值的列是任意的。它主要是货币列。您必须在过滤器参数中进行一些区分(或者,正如您所说,只需使用不同的过滤器)。也许可以像使用
cellFilter.match()
一样来实现这一点?您可以将额外的以冒号分隔的参数传递给过滤器来实现这一点:
{myData|filterName:'someArg':'someOtherArg'}}
如果您事先知道这一点,最好为每种单元格类型创建不同类型的过滤器,然后您可以简化过滤器函数,而无需担心检测要使用哪种过滤器,谢谢@hankscorpio。现在我有一些列,我希望能够显示0和负值,您认为捕捉这些场景的最佳方式是什么?看起来我可能需要显式地处理这些值或使用不同的cellFilter。当你说你想“显示”这些值时,你是什么意思?按原样显示它们(即
返回输入;
)或返回由cellFilter过滤的它们?您可以在此函数中区分
valueIsInRange
valueIsInPercentRange
。如果不知道你想说什么,真的很难说