[英]Counting inside the array of arrays in JavaScript
我正在尝试解决此问题:
我有一个这样的数组(我无法更改其结构方式):
[
[{rivals: ['player1','player2'], winner: "player1"}],
[{rivals: ['player1','player3'], winner: "none"}],
[{rivals: ['player2','player3'], winner: "player3"}],
[{rivals: ['player1','player4'], winner: "none"}]
]
我想要得到的是:计算每个玩家的积分,即如果一个玩家(f.ex player1)获胜,则该玩家的计数器增加3点,如果没有对手获胜,则两个计数器都将增加1点。 因此,最后我想得到类似的东西(基于上面的示例):
const player1Counter = 5;
const player2Counter = 0;
const player3Counter = 4;
const player4Counter = 1;
感谢您的帮助!
您可以为此使用Array.reduce()
。 对于每个子数组,循环播放rivals
数组,并检查玩家是否已经拥有一个计数器。 如果不是,请为该玩家创建一个得分为0的玩家。然后只需检查winner
属性即可更新记录。 如果有赢家,则将该玩家的得分提高3,否则将两名玩家的计数器增加1:
var result = arr.reduce(function(result, sub) {
var obj = sub[0];
obj.rivals.forEach(function(rival) {
result[rival] = result[rival] || 0;
});
if(obj.winner === "none") {
obj.rivals.forEach(function(rival) {
result[rival]++;
});
} else {
result[obj.winner] += 3;
}
return result;
}, {});
可以将其重构为使用ES6箭头功能,如下所示:
let result = arr.reduce((result, {0: obj}) => {
obj.rivals.forEach(rival => result[rival] = result[rival] || 0);
if(obj.winner === "none") {
obj.rivals.forEach(rival => result[rival]++);
} else {
result[obj.winner] += 3;
}
return result;
}, {});
例:
let arr = [[{rivals: ['player1','player2'], winner: "player1"}],[{rivals: ['player1','player3'], winner: "none"}],[{rivals: ['player2','player3'], winner: "player3"}],[{rivals: ['player1','player4'], winner: "none"}]]; let result = arr.reduce((result, {0: obj}) => { obj.rivals.forEach(rival => result[rival] = result[rival] || 0); if(obj.winner === "none") { obj.rivals.forEach(rival => result[rival]++); } else { result[obj.winner] += 3; } return result; }, {}); console.log(result);
注意:此解决方案不会为计数器生成单独的变量。 相反,它会生成一个保存得分的对象,该得分更整洁。
这是一个可以将它们加起来的简洁方法。
const results = [ [{ rivals: ['player1','player2'], winner: "player1" }], [{ rivals: ['player1','player3'], winner: "none" }], [{ rivals: ['player2','player3'], winner: "player3" }], [{ rivals: ['player1','player4'], winner: "none" }] ]; const scores = results.reduce((scores, [{ rivals, winner }]) => Object.assign(scores, winner == 'none' ? { [rivals[0]]: (scores[rivals[0]] || 0) + 1, [rivals[1]]: (scores[rivals[1]] || 0) + 1 } : { [winner]: (scores[winner] || 0) + 3 }), {}); console.log(scores);
如果要确保它们的0
,可以对其进行一些调整:
const results = [ [{ rivals: ['player1','player2'], winner: "player1" }], [{ rivals: ['player1','player3'], winner: "none" }], [{ rivals: ['player2','player3'], winner: "player3" }], [{ rivals: ['player1','player4'], winner: "none" }] ]; const scores = results.reduce((scores, [{ rivals, winner }]) => Object.assign(scores, winner == 'none' ? { [rivals[0]]: (scores[rivals[0]] || 0) + 1, [rivals[1]]: (scores[rivals[1]] || 0) + 1 } : { [rivals[0]]: (scores[rivals[0]] || 0), [rivals[1]]: (scores[rivals[1]] || 0), [winner]: (scores[winner] || 0) + 3 }), {}); console.log(scores);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.