Saya menemukan cuplikan singkat ini (DI SINI )

const pick = (obj, arr) =>
  arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});

Dan saya tidak mengerti peran tanda kurung di bagian ini

(curr in obj && (acc[curr] = obj[curr]), acc)
() => (... && (... = ...), ...)

// First, parentheses after the arrow function means we are returning what is inside
() => (...)

// This looks like a short if statement
curr in obj && ...

// Why are we grouping the assignment into parentheses here?
(acc[curr] = obj[curr])

// What does (..., ...) is supposed to to 
() => (... && (...), acc)
1
eakl 1 Oktober 2021, 08:12

2 jawaban

Jawaban Terbaik

Ini:

(curr in obj && (acc[curr] = obj[curr]), acc)

Adalah cara lain untuk menulis sebagai berikut:

if (curr in obj) {
   acc[curr] = obj[curr];
}

return acc;

Tidak hanya one-liner kurang terbaca, itu juga dapat dianggap menyalahgunakan rel operator koma.

Keterbacaan kode lebih penting daripada menulis kurang baris kode.

// Apa yang seharusnya dilakukan (..., ...)

() => (... && (...), acc)

Tanda kurung dalam ekspresi berikut:

(curr in obj && (acc[curr] = obj[curr]), acc)

Memastikan bahwa:

  1. Ekspresi keseluruhan dievaluasi sebagai ekspresi tunggal yang terdiri dari beberapa sub-ekspresi

  2. Tugas dievaluasi tanpa bagian curr in obj && karena tanpa tanda kurung tersebut, curr in obj && acc[curr] = obj[curr] adalah sintaks yang tidak valid.

    Dengan tanda kurung, ekspresi:

    (acc[curr] = obj[curr])
    

    akan dievaluasi ke nilai obj[curr]. Jadi ekspresinya:

    curr in obj && (acc[curr] = obj[curr])
    

    akan menjadi:

    curr in obj && <assignment value>
    
3
Yousaf 1 Oktober 2021, 05:36

Tanda kurung diperlukan karena jika tidak, ekspresi ini:

curr in obj && acc[curr] = obj[curr]

Akan menjadi sintaks yang tidak valid, karena sisi kiri = akan dievaluasi menjadi curr in obj && acc[curr] (ekspresi), bukan referensi yang dapat ditetapkan.

Tapi ini kode yang mengerikan - ini cukup membingungkan. Versi yang jauh lebih baik adalah

const pick = (obj, arr) => {
    const output = {};
    for (const curr of arr) {
        if (curr in obj) {
            output[curr] = obj[curr]
        }
    }
    return output;
};

Itu jauh lebih mudah dipahami secara sekilas, bukan?

Pilihan lain adalah memfilter entri objek:

const pick = (obj, arr) => Object.fromEntries(
  Object.entries(obj)
    .filter(([key]) => arr.includes(key))
);
3
CertainPerformance 1 Oktober 2021, 05:16