การจัดกลุ่มออบเจกต์ในอาร์เรย์ตามค่า property
ใช้ลูป for...in ร่วมกับ push() เพื่อสร้างออบเจกต์ใหม่ที่จัดกลุ่มตามชื่อ (name)
ตัวอย่างโค้ด
var details = {
"1": { name: "John" },
"2": { name: "John" },
"3": { name: "David" }
};
var objectWithGroupByName = {};
for (var key in details) {
var name = details[key].name;
// ถ้ายังไม่มีกลุ่มนี้ ให้สร้างอาร์เรย์ว่าง
if (!objectWithGroupByName[name]) {
objectWithGroupByName[name] = [];
}
// เพิ่มออบเจกต์เข้าไปในกลุ่มที่ตรงกัน
objectWithGroupByName[name].push(details[key]);
}
console.log(objectWithGroupByName);
วิธีรัน
node fileName.js
ผลลัพธ์
{
John: [ { name: 'John' }, { name: 'John' } ],
David: [ { name: 'David' } ]
}
วิธีเขียนแบบทันสมัย (ES6+)
// ใช้ reduce() สร้างกลุ่มได้กระชับกว่า
const grouped = Object.values(details).reduce((acc, obj) => {
const name = obj.name;
(acc[name] = acc[name] || []).push(obj);
return acc;
}, {});
console.log(grouped);
คำอธิบาย
- วนลูปผ่านทุก key ของออบเจกต์ต้นฉบับ
- ตรวจสอบว่ามีกลุ่มชื่อนั้นอยู่แล้วหรือยัง (ใช้ชื่อเป็น key)
- push ออบเจกต์เข้าไปในอาร์เรย์ของกลุ่มนั้นๆ