ค้นหาเว็บไซต์

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; }