角度过滤器返回异常结果

Angular Filter Returns Unusual Results

本文关键字:异常 结果 返回 过滤器      更新时间:2023-09-30

我有一个过滤器,用于对表上的一列数据进行平均:

app.filter('avgByKey', function () {
return function (data, key) {
    if (typeof (data) === 'undefined' || typeof (key) === 'undefined') {
        return 0;
    }
    var total = 0
    for (var i = 0; i < data.length; i++) {
        total += data[i][key];
    }
    var avg = total / data.length;
    avg = Math.round(avg);
    return parseInt(avg);
}

})

我在我的HTML:中这样使用它

{{y.yearDetails|avgByKey:'" + $scope.columns[i].vchAssociatedDetailColumn + "'}}

过滤器按预期工作,直到我更改其中一个单元格中的数据。如果我更改其中一个单元格中的数字,它将返回一个类似"14578993057614092"的数字作为平均值。我有一个几乎相同的过滤器,我在同一张表上使用它来获得列的总和:

app.filter('sumByKey', function() {
return function (data, key) {
    if (typeof (data) === 'undefined' || typeof (key) === 'undefined') {
        return 0;
    }
    var sum = 0;
    for (var i = data.length - 1; i >= 0; i--) {
        //sum += parseFloat(data[i][key]);
        sum += Math.round((data[i][key]) * 100)/100;
    }
    if (sum < 1) {
        return parseFloat(sum.toPrecision(2));
    }
    else {
        return sum;
    }
};

});

即使我更改其中一个单元格中的数字,它也能完美工作。如果我在用平均值过滤器更改单元格中的一个数字后刷新页面,过滤器会显示"正确"答案,但我必须刷新页面才能得到它。有人能告诉我为什么我的平均值过滤器会出现这种行为,以及我该如何修复它吗?

下面是一个Plunker,它显示了发生的事情:示例

使用-total+=parseInt(data[i][key]);将解决这个问题。

app.filter('avgByKey', function () {
    return function (data, key) {
        if (typeof (data) === 'undefined' || typeof (key) === 'undefined') {
            return 0;
        }
        var total = 0
        for (var i = 0; i < data.length; i++) {
            total += parseInt(data[i][key]);
        }
        var avg = total / data.length;
        avg = Math.round(avg);
        return parseInt(avg);
    }
});

您的输入被解析为字符串值,因此不会以您期望的方式相加。

相反,它们被连接成一个非常长的数字串,比如'3' + '5' + '7' = '357'

您需要使用parseInt()将它们解析为数字。

app.filter('avgByKey', function () {
    return function (data, key) {
        if (typeof (data) === 'undefined' || typeof (key) === 'undefined') {
            return 0;
        }
        var total = 0
        for (var i = 0; i < data.length; i++) {
            total += parseInt(data[i][key]);
        }
        var avg = total / data.length;
        avg = Math.round(avg);
        return parseInt(avg);
    }
});