我有这样的东西:

$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 });

当前回答

如何使用Javascript和对象数组

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

Const traveler = [ {描述:'高级',数量:50}, {描述:'高级',数量:50}, {描述:“成人”,数量:75}, {描述:'Child',数量:35}, {描述:“婴儿”,数量:25}, ]; 函数sum(arrayData, key){ 返回arrayData.reduce((a,b) => { 返回{金额:a.金额+ b.金额} }) } console.log(总和(旅行) `

其他回答

我不确定是否有人提到过这一点。但是有一个lodash函数。下面的代码段,其中value是你要求和的属性,是“value”。

_.sumBy(objects, 'value');
_.sumBy(objects, function(o) { return o.value; });

两者都可以。

我知道这个问题已经有了一个公认的答案,但我认为我应该加入一个使用数组的替代方案。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');

小提琴

我已经在用jquery了。但我认为这已经足够直观了:

var total_amount = 0; 
$.each(traveler, function( i, v ) { total_amount += v.Amount ; });

这基本上只是@akhouri回答的简写版本。

提高可读性和使用Map和Reduce的替代方案:

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

const sum = traveler
  .map(item => item.amount)
  .reduce((prev, curr) => prev + curr, 0);

可重用功能:

const calculateSum = (obj, field) => obj
  .map(items => items.attributes[field])
  .reduce((prev, curr) => prev + curr, 0);

我总是避免改变原型方法和添加库,所以这是我的解决方案:

采用约简阵列原型法就足够了

// + operator for casting to Number
items.reduce((a, b) => +a + +b.price, 0);