角度过滤器返回异常结果

时间:2016-03-30 13:39:04

标签: javascript angularjs

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

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 + "'}}

过滤器按预期工作,直到我更改其中一个单元格中的数据。如果我更改其中一个单元格中的数字,则返回一个数字,例如&#34; 14578993057614092&#34;作为平均值。我有一个几乎相同的过滤器,我在同一个表上使用以获得列的总和:

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;

    }
};

});

即使我更改其中一个单元格中的数字,它也能正常工作。如果我在使用平均过滤器更改单元格中的一个数字后刷新页面,则过滤器会显示&#34;正确的&#34;回答,但我必须刷新页面才能得到它。任何人都可以告诉我为什么我的平均值是过滤器表现出这种行为以及我如何解决它?

这是一个显示会发生什么的Plunker:Example

2 个答案:

答案 0 :(得分:1)

使用 - 总计+ = 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);
    }
});

答案 1 :(得分:0)

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

相反,它们被连接成一长串数字,例如'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);
    }
});