将过滤器添加到JS' parseFloat'和

时间:2018-01-27 13:40:37

标签: javascript node.js parsing

我正在尝试为我的parseFloat方程添加一个过滤器。

$scope.getTotalOffers.forEach(function (offer) {
   $scope.countOffers.offersTotal.total += parseFloat(offer.addOffers);
});

所以这里发生的是数据库表中的每个商品,我正在添加列' addBaskets' - 例如,我为该1项业务提供7项优惠。但是还有另一个名为“发布”的专栏。设置为TRUEFALSE

所以一个人很好,因为它是offersTotal。但是我希望offersActiveoffersDeactivated使用published = truepublished = false作为过滤器......但是如何?

$scope.getTotalOffers = response.data.offers;

$scope.getTotalOffers.forEach(function (offer) {
   $scope.countOffers.offersTotal.total += parseFloat(offer.addOffers);
});

$scope.getTotalOffers.forEach(function (offer) {
   $scope.countOffers.offersActive.total += parseFloat(offer.addOffers); *needs published = true*
});

$scope.getTotalOffers.forEach(function (offer) {
   $scope.countOffers.offersDeactivated.total += parseFloat(offer.addOffers); *needs published = false*
});

我无法理解如何添加此过滤器。提前致谢!

2 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。一个简单的解决方案是使用published作为乘法因子,或作为三元运算符中的条件,但更好的解决方案是动态引用offersActiveoffersDeactivated属性,基于价值addOffers

var props = ['offersDeactivated', 'offersActive'];
$scope.getTotalOffers.forEach(function (offer) {
   $scope.countOffers[props[+offer.published]].total += parseFloat(offer.addOffers);
   // This you already had, and can stay as it is:
   $scope.countOffers.offersTotal.total += parseFloat(offer.addOffers);
});

因此,这将两个循环的原始想法转变为一个循环。

答案 1 :(得分:0)

要做的就是在之前过滤项目:

$scope.getTotalOffers = response.data.offers;

$scope.getTotalOffers.forEach(function (offer) {
   $scope.countOffers.offersTotal.total += parseFloat(offer.addOffers);
});

$scope.getTotalOffers
    .filter(function (offer) {
        return offer.published;
    })
    .forEach(function (offer) {
        $scope.countOffers.offersActive.total += parseFloat(offer.addOffers);
    });

$scope.getTotalOffers
    .filter(function (offer) {
        return !offer.published;
    })
    .forEach(function (offer) {
        $scope.countOffers.offersDeactivated.total += parseFloat(offer.addOffers);
    });

这是一个稍微优雅的版本,使用reduce代替forEach

$scope.getTotalOffers = response.data.offers;

$scope.countOffers.offersTotal.total = $scope.getTotalOffers.reduce(function (acc, offer) {
    return acc + parseFloat(offer.addOffers);
}, 0);


$scope.countOffers.offersActive.total = $scope.getTotalOffers
    .filter(function (offer) {
        return offer.published;
    })
    .reduce(function (acc, offer) {
        return acc + parseFloat(offer.addOffers);
    }, 0);

$scope.countOffers.offersDeactivated.total = $scope.getTotalOffers
    .filter(function (offer) {
        return !offer.published;
    })
    .reduce(function (acc, offer) {
        return acc + parseFloat(offer.addOffers);
    }, 0);

由于reduce部分都是相同的,我们可以将它们分解出来:

function addUpOffers(offers) {
    return offers.reduce(function (acc, offer) {
        return acc + parseFloat(offer.addOffers);
    }, 0);
}

$scope.getTotalOffers = response.data.offers;

$scope.countOffers.offersTotal.total = addUpOffers($scope.getTotalOffers);


$scope.countOffers.offersActive.total = addUpOffers(
    $scope.getTotalOffers.filter(function (offer) {
        return offer.published;
    })
);

$scope.countOffers.offersDeactivated.total = addUpOffers(
    $scope.getTotalOffers.filter(function (offer) {
        return !offer.published;
    })
);