Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

คำนวณค่าเฉลี่ยจากข้อมูล 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" เหมือนกัน)
  • รวมคะแนน (Points) ของพวกเขาเข้าด้วยกัน
  • เพิ่มฟิลด์ "Average" ใหม่ในแต่ละออบเจ็กต์ ซึ่งมีค่าเฉลี่ยคะแนนของซัพพลายเออร์คนนั้น

ดังนั้น ผลลัพธ์สุดท้ายควรเป็นดังนี้:

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;
      // ใช้ 'Average' เป็นตัวนับจำนวนรายการ (ในขั้นแรก)
    };
    return acc;
  }, {});
  // หาค่าเฉลี่ยของ 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
  }
]