สมมติว่ามีอาร์เรย์ JavaScript ดังนี้:
const data = [
{
"dataId": "1",
"tableName": "table1",
"column": "firstHeader",
"rows": [ "a","b","c" ]
},
{
"dataId": "2",
"tableName": "table1",
"column": "secondHeader",
"rows": [ "d","e","f" ]
},
{
"dataId": "3",
"tableName": "table2",
"column": "aNewFirstHeader",
"rows": [ 1,2,3 ]
}
];
เราต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์ดังกล่าว ฟังก์ชันควรสร้างอาร์เรย์ของออบเจ็กต์ที่จัดกลุ่มแล้ว โดยอิงจากอาร์เรย์ต้นฉบับ
อาร์เรย์ที่จัดกลุ่มควรมีข้อมูลสำหรับออบเจ็กต์ "tableName" ที่ไม่ซ้ำกันแยกเป็นออบเจ็กต์ของตัวเอง
ดังนั้น ผลลัพธ์สุดท้ายควรเป็นดังนี้:
const output = [
{
"tableName": "table1",
"column": ["firstHeader", "secondHeader"],
"rows": [["a","b","c"], ["d","e","f"]]
},
{
"tableName": "table2",
"column": ["aNewFirstHeader"],
"rows": [[1,2,3]]
}
];
ตัวอย่าง
const arr = [
{
"dataId": "1",
"tableName": "table1",
"column": "firstHeader",
"rows": [ "val","b","c" ]
},
{
"dataId": "2",
"tableName": "table1",
"column": "secondHeader",
"rows": [ "d","e","f" ]
},
{
"dataId": "3",
"tableName": "table2",
"column": "aNewFirstHeader",
"rows": [ 1,2,3 ]
}
];
const groupArray = (arr = []) => {
const res = arr.reduce((obj => (acc, val) => {
let item = obj.get(val.tableName);
if (!item) {
item = {
tableName: val.tableName, column: [], rows: []
}
obj.set(val.tableName, item); acc.push(item);
};
item.column.push(val.column); item.rows.push(val.rows);
return acc;
})(new Map), []);
return res;
};
console.log(JSON.stringify(groupArray(arr), undefined, 4));
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็นดังนี้:
[
{
"tableName": "table1",
"column": [
"firstHeader",
"secondHeader"
],
"rows": [
[ "val", "b", "c" ],
[ "d", "e", "f" ]
]
},
{
"tableName": "table2",
"column": [ "aNewFirstHeader" ],
"rows": [ [ 1, 2, 3 ] ]
}
]