javascript - การจัดกลุ่มอาร์เรย์ของวัตถุไปยังวัตถุของอาร์เรย์โดยใช้หลายคีย์และเพิ่ม id ของกลุ่มไปยังคีย์
สร้างตัวอย่างโค้ด -
อินเทอร์เฟซ -
interface IInterface {
id: number;
name: string;
age: number;
}
อาเรย์ -
const arr: IInterface[] = [
{
id: 1,
name: 'daniel',
age: 12
},
{
id: 2,
name: 'jonny',
age: 13
},
{
id: 3,
name: 'daniel',
age: 12
},
{
id: 4,
name: 'daniel',
age: 12
}
]
ฟังก์ชัน GroupBy -
const GroupBy = (
array: IInterface[],
f: (element: IInterface) => (string | number | undefined)[]
) => {
const groups: { [key: string]: IInterface[] } = {};
array.forEach((object) => {
const group = f(object).join("-");
groups[group] = groups[group] || [];
groups[group].push(object);
});
return groups;
};
การใช้ฟังก์ชัน groupBy -
const Grouped = GroupBy(arr, (element: IInterface) => {
return [
element.name, element.age,
];
});
ผลลัพธ์ตอนนี้ -
{
"daniel-12": [
{
"id": 1,
"name": "daniel",
"age": 12
},
{
"id": 3,
"name": "daniel",
"age": 12
},
{
"id": 4,
"name": "daniel",
"age": 12
}
],
"jonny-13": [
{
"id": 2,
"name": "jonny",
"age": 13
}
]
}
ผลลัพธ์ที่ต้องการ -
{
"daniel-12-ids-1-3-4": [
{
"id": 1,
"name": "daniel",
"age": 12
},
{
"id": 3,
"name": "daniel",
"age": 12
},
{
"id": 4,
"name": "daniel",
"age": 12
}
],
"jonny-13-ids-2": [
{
"id": 2,
"name": "jonny",
"age": 13
}
]
}
ต้องการให้ทุกไอดีของกลุ่มอยู่ที่ชื่อคีย์ .......................................................................................................................................................
คำตอบ #1
คุณสามารถสร้างวัตถุใหม่จากวัตถุเก่าได้
const
grouped = { "daniel-12": [{ id: 1, name: "daniel", age: 12 }, { id: 3, name: "daniel", age: 12 }, { id: 4, name: "daniel", age: 12 }], "jonny-13": [{ id: 2, name: "jonny", age: 13 }] },
result = Object.fromEntries(Object.entries(grouped).map(([k, v]) => [
[k, 'ids', v.map(({ id }) => id).join('-')].join('-'),
v
]));
console.log(result);.as-console-wrapper { max-height: 100% !important; top: 0; }