我有这样的东西:

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

当前回答

你可以使用Array.prototype.reduce:

const sum = traveler.reduce((acc , val)=>{
   return acc + val.amount;
} ,0);

其他回答

你可以使用Array.prototype.reduce:

const sum = traveler.reduce((acc , val)=>{
   return acc + val.amount;
} ,0);

只是另一种说法,这就是原生JavaScript函数Map和Reduce的用途(Map和Reduce是许多语言中的强大功能)。

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

function amount(item){
  return item.Amount;
}

function sum(prev, next){
  return prev + next;
}

traveler.map(amount).reduce(sum);
// => 235;

// or use arrow functions
traveler.map(item => item.Amount).reduce((prev, next) => prev + next);

注意:通过创建独立的小函数,我们可以再次使用它们。

// Example of reuse.
// Get only Amounts greater than 0;

// Also, while using Javascript, stick with camelCase.
// If you do decide to go against the standards, 
// then maintain your decision with all keys as in...

// { description: 'Senior', Amount: 50 }

// would be

// { Description: 'Senior', Amount: 50 };

var travelers = [{description: 'Senior', amount: 50},
                {description: 'Senior', amount: 50},
                {description: 'Adult', amount: 75},
                {description: 'Child', amount: 35},
                {description: 'Infant', amount: 0 }];

// Directly above Travelers array I changed "Amount" to "amount" to match standards.

function amount(item){
  return item.amount;
}

travelers.filter(amount);
// => [{description: 'Senior', amount: 50},
//     {description: 'Senior', amount: 50},
//     {description: 'Adult', amount: 75},
//     {description: 'Child', amount: 35}];
//     Does not include "Infant" as 0 is falsey.

经过这些回答后,我认为实际上一个for(或forEach或for of with await)循环比reduce甚至map和reduce更具可读性。 认为:

在6个月后回到这段代码或者由其他人维护它。我认为你使用循环的方法已经足够好了。 在将来扩展这个函数,以防您想要添加货币转换或类似的功能。在一行代码中执行此操作并不是一个好主意。

Var traveler = [ {数量:50,描述:'高级'}, {数量:50,描述:'高级'}, {数量:75,描述:“成人”}, {数量:35,描述:'Child'}, {数量:25,描述:“婴儿”} ]; var sumFromArray = (propertyName, array) => { 设sum = 0; 数组中。forEach(item => { sum += item[propertyName] ?0; }); 返回总和; }; var sumOfTraveler = sumFromArray('Amount', traveler); console.log (sumOfTraveler);

使用类型你的函数定义可能像这样:

const sumFromArray = (propertyName: string, array: Array<{[propertyName: string]: number}>) => { ... };

类型文字中的计算属性名必须直接引用内置符号

我没有反对地图,减少或单行,这只是思考的食物。

它在TypeScript和JavaScript中为我工作:

令LST = [ {说明:'高级',价格:10}, {说明:“成人”,价格:20}, {描述:“儿童”,价格:30} ]; 令sum = lst。Map (o => o.price)。Reduce ((a, c) => {return a + c}); console.log(总和);

希望对大家有用。

这里有一个我觉得更灵活的解决办法:

function sumOfArrayWithParameter (array, parameter) {
  let sum = null;
  if (array && array.length > 0 && typeof parameter === 'string') {
    sum = 0;
    for (let e of array) if (e && e.hasOwnProperty(parameter)) sum += e[parameter];
  }
  return sum;
}

要得到和,只需像这样使用它:

let sum = sumOfArrayWithParameter(someArray, 'someProperty');