【发布时间】:2021-08-22 08:39:20
【问题描述】:
我已经为我在处理 JavaScript 数据结构时的一个测验找到了一个解决方案,其中一个对象(命名为游戏)如下所示。
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,
},
};
测验或挑战是:创建一个名为“scorers”的对象,其中包含作为属性得分的球员的姓名,以及作为值的进球数。在这个游戏中,它会是这样的:
{
Gnarby: 1,
Hummels: 1,
Lewandowski: 2
}
我找到了以下解决方案:
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}
我的问题是语法scorers[player] = (scorers[player] || 0) + 1;如何为每个玩家属性生成值,尽管它是真或假,以及如何在最后添加1,尽管它是数字类型?如何用简单的语言解释这段代码?
【问题讨论】:
-
不,它不会产生
boolean。scorers[player] || 0将返回scorers[player]的值,如果它已经包含在scorers对象中,否则返回0。然后将1添加到它并重新分配给scorers[player]。因此,它永远是一个数字,而不是一个布尔值 -
顺便说一句。因为
game.scored是一个数组,你可以像for (let player of game.scored)一样直接迭代它,不需要Object.values() -
const scorers = {}; for (let player of game.scored){ scorers[player] = (scorers[player] || 0) + 1; } console.log(scorers)值将是 0 或在每次迭代中将考虑添加的值并分配为对象属性的新值。
标签: javascript arrays object