2017-04-06 19 views
1

我有一个前端有一个订单表。每个订单可以交付,不交付或部分交付。我需要根据选择哪个选项来计算总计(因此总计也被过滤),并且我确实找到了一个解决方案,但我知道我过于复杂,我并不是一个真正的AngularJS开发人员。AngularJS计算几个相同对象的合计

function calculateTotals(){ 

    vm.sales.total_amount = {'_': 0, '_not': 0, '_part': 0, '_done': 0, 'n-p': 0}; 
    vm.sales.total_price = {'_': 0, '_not': 0, '_part': 0, '_done': 0, 'n-p': 0}; 
    vm.sales.order_total_price = {'_': 0, '_not': 0, '_part': 0, '_done': 0, 'n-p': 0}; 
    vm.sales.order_total_amount = {'_': 0, '_not': 0, '_part': 0, '_done': 0, 'n-p': 0}; 

    angular.forEach(vm.sales, function (sale) { 
     angular.forEach(vm.sales.total_amount, function(value, key){ 
      vm.sales.total_amount[key] += (sale.status == key) ? sale.total_amount * 1 : 0; 
      vm.sales.total_price[key] += (sale.status == key) ? sale.total_price * 1 : 0; 
      vm.sales.order_total_amount[key] += (sale.status == key) ? sale.order_total_amount * 1 : 0; 
      vm.sales.order_total_price[key] += (sale.status == key) ? sale.order_total_price * 1 : 0; 
     }); 
     vm.sales.total_amount['_'] += sale.total_amount * 1; 
     vm.sales.total_price['_'] += sale.total_price * 1; 
     vm.sales.order_total_amount['_'] += sale.order_total_amount * 1; 
     vm.sales.order_total_price['_'] += sale.order_total_price * 1; 
    }); 

    vm.sales.total_amount['_'] = vm.sales.total_amount['_'] - vm.sales.total_amount['n-p']; 
    vm.sales.total_price['_'] = vm.sales.total_price['_'] - vm.sales.total_price['n-p']; 
    vm.sales.order_total_amount['_'] = vm.sales.order_total_amount['_'] - vm.sales.order_total_amount['n-p']; 
    vm.sales.order_total_price['_'] = vm.sales.order_total_price['_'] - vm.sales.order_total_price['n-p']; 
} 

有4个变量我需要在前面,总量和总价格(许多交付的总和,从Laravel后端未来总结),订单总价格和订单总量(从Laravel后端取)。

我该如何简化?

编辑感谢stej4n我已经走到这...虽然我仍然觉得它可以去简单

function calculateTotals() { 

    var properties = ['total_amount', 'total_price', 'order_total_amount', 'order_total_price']; 
    var keys = ['_', '_not', '_part', '_done', 'n-p']; 

    angular.forEach(properties, function (prop) { 
     vm.sales[prop] = {'_': 0, '_not': 0, '_part': 0, '_done': 0, 'n-p': 0}; 
    }); 

    angular.forEach(vm.sales, function (sale) { 
     angular.forEach(properties, function (prop) { 
      vm.sales[prop]['_'] += sale[prop] * 1; 
      angular.forEach(keys, function (key) { 
       vm.sales[prop][key] += (sale.status == key) ? sale[prop] * 1 : 0; 
      }); 
     }); 
    }); 

    angular.forEach(properties, function (prop) { 
     vm.sales[prop]['_'] -= vm.sales[prop]['n-p']; 
    }); 
} 

回答

1

4个最后一行已经可以简化这种方式:

angular.forEach(['total_amount', 'total_price', 'order_total_amount'], function(prop) { 
    vm.sales[prop] -= vm.sales[prop]['n-p']; 
}); 

(sale.status == key)从哪里来? status属性不存在于vm.sales的任何对象中?

附加的优化:删除所有* 1,它不会改变任何东西^^

+0

vm.sales是从后端获取的集合。每个销售有一个状态 – Norgul

+0

我认为你可以安全地删除每个'* 1' –