繁体   English   中英

在JavaScript中对数组的数组进行计数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM