在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);

注意:此解决方案不会为计数器生成单独的变量。相反,它会生成一个保存得分的对象,该得分更整洁。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章