我正在尝试解决此问题:
我有一个这样的数组(我无法更改其结构方式):
[
[{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);
注意:此解决方案不会为计数器生成单独的变量。相反,它会生成一个保存得分的对象,该得分更整洁。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句