1. ホーム
  2. ジャバスクリプト

[解決済み】配列内のプロパティ値を合計するためのより良い方法

2022-03-30 18:05:17

質問

このようなものがあります。

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

配列が1つだけなら簡単ですが、プロパティ名が異なる他の配列があるので、それを合計したいのです。

こんなことができれば、もっとうれしいです。

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

しかし、今後このように再利用できるような形で進めていくには、どうすればいいのかわかりません。

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

解決方法は?

回答を更新しました

Arrayプロトタイプに関数を追加することのすべての欠点のために、私はこの答えを更新して、質問で最初に要求された構文と同様の構文を維持する代替案を提供しています。

class TravellerCollection extends Array {
    sum(key) {
        return this.reduce((a, b) => a + (b[key] || 0), 0);
    }
}
const traveler = new TravellerCollection(...[
    {  description: 'Senior', Amount: 50},
    {  description: 'Senior', Amount: 50},
    {  description: 'Adult', Amount: 75},
    {  description: 'Child', Amount: 35},
    {  description: 'Infant', Amount: 25 },
]);

console.log(traveler.sum('Amount')); //~> 235

オリジナル回答

配列なので、Arrayのプロトタイプに関数を追加することができます。

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

Array.prototype.sum = function (prop) {
    var total = 0
    for ( var i = 0, _len = this.length; i < _len; i++ ) {
        total += this[i][prop]
    }
    return total
}

console.log(traveler.sum("Amount"))

ザ・ファイドル http://jsfiddle.net/9BAmj/