Encontré una solución para una de las pruebas que tengo al trabajar con la estructura de datos de JavaScript, en la que se proporcionó un objeto (juego con nombre) de la siguiente manera.
const game = { score: '4:0', scored: ['Lewandowski', 'Gnarby', 'Lewandowski', 'Hummels'], //Names of players date: 'Nov 9th, 2037', odds: { team1: 1.33, x: 3.25, team2: 6.5, }, };
El cuestionario o desafío consiste en crear un objeto llamado 'goleadores' que contenga los nombres de los jugadores que anotaron como propiedades y el número de goles como valor. En este juego, se verá así:
{ Gnarby: 1, Hummels: 1, Lewandowski: 2 }
Encontré la siguiente solución:
let scorers = {}; let arr = Object.values(game.scored); for(const player of arr) { scorers[player] = (scorers[player] || 0) + 1; } console.log(scorers); // {Lewandowski: 2, Gnarby: 1, Hummels: 1}
Mi pregunta es cómo la sintaxis scorers[player] = (scorers[player] || 0) + 1;
produce valores para cada propiedad del jugador, aunque será verdadero o falso, y ¿cómo al final se agregará 1 aunque sea de tipo número? ¿Cómo interpretar este código en un lenguaje sencillo?
A diferencia de otros lenguajes, JavaScript permite que se usen otros tipos de datos para lo que parecen ser operadores puramente booleanos. En ese caso, JavaScript interpretará temporalmente un valor no booleano como "falso" o "verdadero".
Hay dos casos:
scorers[player]
no está definido. En ese caso el ||
El operando identificará ese valor como un valor "falso" y, por lo tanto, continuará evaluando el operando correcto, que es 0. Entonces (undefined || 0)
se evalúa como 0.
se define scorers[player]
, y (para este programa) será un número positivo. En ese caso el ||
el operando lo considerará "veraz" y no evaluará el operando correcto. Entonces (1 || 0)
se evalúa como 1.
NB: en JavaScript moderno, ahora es una mejor práctica usar el ??
operador para este caso de uso en lugar de ||
.
La sintaxis scorers[player] || 0
se llama cortocircuito en JavaScript.
Es tan simple como AND, OR AND NOT
en álgebra lógica. De forma predeterminada, una propiedad inexistente en JS Object produce undefined (lo que significa Boolean false). Aquí hay algunos usos del cortocircuito en JS.
Su declaración scorers[player] = (scorers[player] || 0
dará como resultado el resultado socres [jugador] si existe o 0. Cuando le agregó 1, aumentará el recuento de goles del jugador actual. Eso dará como resultado en 0 o +1 a la puntuación actual del jugador Cada paso involucrado en esa declaración se muestra a continuación.