สมมติว่ามีอาร์เรย์ของอาร์เรย์ดังนี้:
const arr = [ ["Ashley", "2017-01-10", 80], ["Ashley", "2017-02-10", 75], ["Ashley", "2017-03-10", 85], ["Clara", "2017-01-10", 90], ["Clara", "2017-02-10", 82] ];
เราต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์ดังกล่าวเป็นอินพุตเดียว ฟังก์ชันควรสร้างอาร์เรย์ของออบเจ็กต์ใหม่โดยอิงจากอาร์เรย์อินพุท อาร์เรย์ควรมีออบเจ็กต์สำหรับแต่ละซับอาร์เรย์ที่ไม่ซ้ำกัน (โดย "ไม่ซ้ำ" ในบริบทนี้หมายถึงซับอาร์เรย์ที่มีองค์ประกอบแรกไม่ซ้ำกัน)
แต่ละออบเจ็กต์ต้องมีโครงสร้างดังนี้:
const output = [
{"name": "Ashley", "2017-01-10": 80, "2017-02-10": 75, "2017-03-10": 85},
{"name": "Clara", "2017-01-10": 90, "2017-02-10": 82}
];
ตัวอย่าง
const arr = [
["Ashley", "2017-01-10", 80],
["Ashley", "2017-02-10", 75],
["Ashley", "2017-03-10", 85],
["Clara", "2017-01-10", 90],
["Clara", "2017-02-10", 82]
];
const groupArray = (arr = []) => {
let grouped = [];
grouped = arr.reduce(function (hash) {
return function (r, a) {
if (!hash[a[0]]) {
hash[a[0]] = { name: a[0] };
r.push(hash[a[0]]);
}
hash[a[0]][a[1]] = a[2];
return r;
};
}(Object.create(null)), []);
return grouped;
};
console.log(groupArray(arr));
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็นดังนี้:
[
{ name: 'Ashley', '2017-01-10': 80, '2017-02-10': 75, '2017-03-10': 85 },
{ name: 'Clara', '2017-01-10': 90, '2017-02-10': 82 }
]