我有这样的东西:

$scope.traveler = [
            {  description: 'Senior', Amount: 50},
            {  description: 'Senior', Amount: 50},
            {  description: 'Adult', Amount: 75},
            {  description: 'Child', Amount: 35},
            {  description: 'Infant', Amount: 25 },
];

现在,为了得到这个数组的总数量,我做了这样的事情:

$scope.totalAmount = function(){
       var total = 0;
       for (var i = 0; i < $scope.traveler.length; i++) {
              total = total + $scope.traveler[i].Amount;
            }
       return total;
}

当只有一个数组时,这很容易,但我有其他具有不同属性名的数组,我想要求和。

如果我能做这样的事情,我会更快乐:

$scope.traveler.Sum({ Amount });

但我不知道怎样才能在将来重复使用它:

$scope.someArray.Sum({ someProperty });

当前回答

使用reduce和解构来求和

const traveler = [
  { description: 'Senior', Amount: 50 },
  { description: 'Senior', Amount: 50 },
  { description: 'Adult', Amount: 75 },
  { description: 'Child', Amount: 35 },
  { description: 'Infant', Amount: 25 },
];

console.log(traveler.reduce((n, {Amount}) => n + Amount, 0))

其他回答

我想我应该在这一点上发表我的意见:这是那些应该始终是纯函数式的操作之一,不依赖于任何外部变量。有几个已经给出了很好的答案,使用减法是这里要走的路。

既然我们大多数人已经可以使用ES2015语法,下面是我的建议:

const sumValues = (obj) => Object.keys(obj).reduce((acc, value) => acc + obj[value], 0);

我们把它变成了一个不可变函数。reduce在这里所做的很简单: 从累加器的值0开始,并将当前循环项的值加到累加器中。

函数式编程和ES2015太棒了!:)

也可以使用Array.prototype.forEach()

let totalAmount = 0;
$scope.traveler.forEach( data => totalAmount = totalAmount + data.Amount);
return totalAmount;

我真的很沮丧,在阅读所有的代码,其中张贴作为一个解决方案,因为我是一个新的是,我试图添加一个功能到一个简单的应用程序的实践。解决这个问题的简单方法是

let testArray = [5, 7, 8, 4];

function(){
sum = 0;
for(let i = 0; i < testArray.length; i++){
    sum += testArray[i];
}

//会给你数组的和

我知道这个问题已经有了一个公认的答案,但我认为我应该加入一个使用数组的替代方案。Reduce,因为对数组求和是Reduce的规范示例:

$scope.sum = function(items, prop){
    return items.reduce( function(a, b){
        return a + b[prop];
    }, 0);
};

$scope.travelerTotal = $scope.sum($scope.traveler, 'Amount');

小提琴

下面是一个使用ES6箭头函数的一行程序。

const sumPropertyValue = (items, prop) => items.reduce((a, b) => a + b[prop], 0);

// usage:
const cart_items = [ {quantity: 3}, {quantity: 4}, {quantity: 2} ];
const cart_total = sumPropertyValue(cart_items, 'quantity');