Encontré este breve fragmento ( AQUÍ )
const pick = (obj, arr) => arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});Y no entiendo el papel de los paréntesis en esta parte.
(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)Los paréntesis son obligatorios porque, de lo contrario, esta expresión:
curr in obj && acc[curr] = obj[curr] sería una sintaxis no válida, porque el lado izquierdo de = se evaluaría como curr in obj && acc[curr] (una expresión), no una referencia a la que se pueda asignar.
Pero este es un código horrible, es bastante confuso. Una versión mucho mejor sería
const pick = (obj, arr) => { const output = {}; for (const curr of arr) { if (curr in obj) { output[curr] = obj[curr] } } return output; };Eso es mucho más fácil de entender de un vistazo, ¿no?
Otra opción es filtrar las entradas del objeto:
const pick = (obj, arr) => Object.fromEntries( Object.entries(obj) .filter(([key]) => arr.includes(key)) );Este:
(curr in obj && (acc[curr] = obj[curr]), acc)es otra forma de escribir lo siguiente:
if (curr in obj) { acc[curr] = obj[curr]; } return acc;No solo la frase de una sola línea es menos legible, sino que también se puede considerar que abusa del operador de coma .
La legibilidad del código es más importante que escribir menos líneas de código.
// ¿Qué se supone que debe hacer (..., ...)?
() => (... && (...), acc)
Paréntesis en la siguiente expresión:
(curr in obj && (acc[curr] = obj[curr]), acc)asegurarse de que:
La expresión general se evalúa como una sola expresión que consta de varias subexpresiones
La asignación se evalúa sin la parte curr in obj && porque sin esos paréntesis, curr in obj && acc[curr] = obj[curr] no es una sintaxis válida.
Entre paréntesis, la expresión:
(acc[curr] = obj[curr]) evaluará el valor de obj[curr] . Entonces la expresión:
curr in obj && (acc[curr] = obj[curr])se convertirá:
curr in obj && <assignment value>