根據多個篩選條件從 JSON 資料中計算平均值 JavaScript


假設我們有一個這樣的物件陣列 −

const arr = [
   { "SupplierName" : "John", "Category " : "A", "Points" : 3 },
   { "SupplierName" : "John", "Category " : "A", "Points" : 11 },
   { "SupplierName" : "John", "Category " : "A", "Points" : undefined },
   { "SupplierName" : "John", "Category " : "B", "Points" : 2 },
   { "SupplierName" : "John", "Category " : "B", "Points" : 6 },
   { "SupplierName" : "Praveen", "Category " : "A", "Points" : 3 },
   { "SupplierName" : "Praveen", "Category " : "A", "Points" : 7 }
];

我們需要編寫一個接收此類陣列的 JavaScript 函式。

該函式應執行以下操作 −

  • 將重複的供應商分組到一個唯一獨立的物件中(重複指的是“SupplierName”和“Category”欄位相同的物件)。
  • 將它們的積分加在一起
  • 向每個物件新增一個新的“平均值”欄位,其中包含該供應商的平均積分。

因此,最終輸出應如下所示 −

const output = [
   { "SupplierName" : "John", "Category " : "A", "Points" : 14, "Average" : 7 },
   { "SupplierName" : "John", "Category " : "B", "Points" : 8, "Average" : 4 },
   { "SupplierName" : "Praveen", "Category " : "A", "Points" : 10, "Average" : 5 }
];

示例

const arr = [
   { "SupplierName" : "John", "Category " : "A", "Points" : 3 },
   { "SupplierName" : "John", "Category " : "A", "Points" : 11 },
   { "SupplierName" : "John", "Category " : "A", "Points" : undefined },
   { "SupplierName" : "John", "Category " : "B", "Points" : 2 },
   { "SupplierName" : "John", "Category " : "B", "Points" : 6 },
   { "SupplierName" : "Praveen", "Category " : "A", "Points" : 3 },
   { "SupplierName" : "Praveen", "Category " : "A", "Points" : 7 }
];
const groupAndAverage = (arr = []) => {
   const groups = arr.reduce((acc, obj) => {
       const name = obj.SupplierName + obj.Category;
      if (acc[name]) {
         if (obj.Points) (acc[name].Points += obj.Points) && ++acc[name].Average;
      }
      else { acc[name] = obj;
         acc[name].Average = 1;
         // taking 'Average' attribute as an items counter(on the first phase)
      };
      return acc;
   }, {});
   // getting "average of Points" const res = Object.keys(groups).map( name => {       groups[name].Average = Math.round(groups[name].Points/groups[name].Average);
      return groups[name];
   });
   return res;
}; console.log(JSON.stringify(groupAndAverage(arr), undefined, 4));

輸出

並且控制檯中的輸出將為 −

[
   {
      "SupplierName": "John",
      "Category ": "A",
      "Points": 22,
      "Average": 6
   },
   {
      "SupplierName": "Praveen",
      "Category ": "A",
      "Points": 10,
      "Average": 5
   }
]

更新於: 23-11-2020

1 千+ 瀏覽

開啟你的職業生涯

完成課程獲得認證

立即開始
廣告