Saya memiliki array seperti ini di mana employeeIds dapat muncul beberapa kali dengan kode yang berbeda.

employees: [
      {
        employeeId: '2',
        code: 64897
      },
      {
        employeeId: '4'
        code: 64897
      },
      {
        employeeId: '1',
        code: 64897
      },
      {
        employeeId: '4',
        code: 67986
      },
      {
        employeeId: '1',
        code: 67986
      }]

Apa cara terbaik untuk mengubah ini menjadi array di mana employeeIds muncul sekali tetapi memiliki array semua kode mereka dari data awal seperti ini?

employees: [
{
    employeeId: '2',
    codes: [64897]
},
{
    employeeId: '1',
    codes: [64897, 67986]
},
{
    employeeId: '4',
    codes: [64897, 67986]
}]
-1
Lysandus 8 April 2021, 17:00

3 jawaban

Jawaban Terbaik
  1. Mengurangi larik employees menjadi Map di mana kunci Peta adalah employeeId dan nilainya adalah larik kode karyawan.

  2. Membuat larik yang Map menggunakan Array.from().

Periksa cuplikan kode di bawah ini:

const employees = [
  { employeeId: '2', code: 64897 },
  { employeeId: '4', code: 64897 },
  { employeeId: '1', code: 64897 },
  { employeeId: '4', code: 67986 },
  { employeeId: '1', code: 67986 },
];

const merged = Array.from(
  employees.reduce(
    (res, { employeeId, code }) => (
      res.has(employeeId)
        ? res.get(employeeId).push(code)
        : res.set(employeeId, [code]),
      res
    ),
    new Map()
  ),
  ([employeeId, code]) => ({ employeeId, code })
);

console.log(merged);
2
Som Shekhar Mukherjee 8 April 2021, 19:04

Anda dapat mengurangi dengan Map dan membuat objek baru dari entri peta.

const
    employees = [{ employeeId: '2', code: 64897 }, { employeeId: '4', code: 64897 }, { employeeId: '1', code: 64897 }, { employeeId: '4', code: 67986 }, { employeeId: '1', code: 67986 }],
    grouped = Array.from(
        employees.reduce((m, { employeeId, code }) =>
            m.set(employeeId, [...(m.get(employeeId) || []), code]), new Map),
        ([employeeId, code]) => ({ employeeId, code })
    );

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 8 April 2021, 14:20

Ini terdengar seperti tempat yang bagus untuk menggunakan reduce(). Pada dasarnya, kita dapat mengulang melalui array objek dan menguranginya menjadi array objek karyawan yang dikonsolidasikan. Ini harus bekerja:

let employees = [
    {
        employeeId: '2',
        code: 64897
    }, {
        employeeId: '4',
        code: 64897
    }, {
        employeeId: '1',
        code: 64897
    }, {
        employeeId: '4',
        code: 67986
    }, {
        employeeId: '1',
        code: 67986
    }
];

employees = employees.reduce((a,c) => (a.find(e => e.employeeId === c.employeeId) ? a.find(e => e.employeeId === c.employeeId).codes.push(c.code) : a.push({ employeeId: c.employeeId, codes: [c.code] }), a), []);

console.log(employees);

Informasi lebih lanjut tentang pengurangan di sini (dokumen MDN). Ini masih merupakan fungsi prototipe satu array yang saya perjuangkan untuk dikuasai, tetapi ini sangat kuat.

1
Brandon McConnell 8 April 2021, 14:11