【问题标题】:javascript reduce not working - trying to sum multiple object values inside arrayjavascript reduce 不起作用 - 尝试对数组中的多个对象值求和
【发布时间】:2018-01-10 08:09:36
【问题描述】:

games 数组中有很多对象,我想将所有计算都返回到 reduce 函数中的对象。当前代码仅适用于两个数组项。

games = [
    { 
     game_id: 21700001,
     pts: 27},
    {
     game_id: 21700002,
     pts: 27
    },
    {
     game_id: 21700002,
     pts: 27

    }]
    
    

var stats = games.reduce(function(prev, curr) {

return { ppg: prev.pts + curr.pts }

});


console.log(stats);

【问题讨论】:

  • Stackoverflow 不是通用调试器。请提供一些额外的信息。至少:当前的行为是什么?期望的行为是什么?
  • 目前,reducer 函数将 prev 和 curr 对象的 pts 相加。 reducer 函数应该能够对数组中所有对象的对象值求和。当前代码仅在数组中有两个对象时才有效,但应该适用于任意数量的对象。
  • 整理一个简化的测试用例。这应该是微不足道的。

标签: javascript reduce


【解决方案1】:

你需要指定一个初始参数来减少 -

.reduce(function(prev,curr) {
...
},{});

然后,如果这是您第一次通过,那么您必须了解 prev.XXX 将是未定义的,因此您始终可以将其归为 0:

return { 
    ppg: ((prev.pts || 0) + curr.pts)/totalGames, 
    apg: ((prev.ast || 0) + curr.ast)/totalGames, 
    rpg: ((prev.oreb || 0) + curr.oreb + (prev.dreb || 0) + curr.dreb)/totalGames, 
    fgp: (((prev.fgm || 0) + curr.fgm)/((prev.fga || 0) + curr.fga))*100, 
    fg3p: (((prev.fg3m || 0) + curr.fg3m)/((prev.fg3a || 0) + curr.fg3a))*100 
}

如果仍然失败 - 然后检查您的控制台是否有错误。

【讨论】:

  • @TKG 什么不起作用?你的数组元素是否具有相同的结构?
【解决方案2】:

Reduce 使用您作为prev 返回的内容。 因此,如果你从reduce 返回一个string,那么prev 的值就是一个字符串。如果您返回一个与前一个对象完全不同的对象,那么您不会将两个相同类型的对象加在一起。

把它分成多个部分。

const tallyGames = (a, b) =>
  Object.assign({}, a, b, {
    pts: a.pts + b.pts,
    ast: a.ast + b.ast,
    // ...
  });

const buildStatsObject = reults => ({
  ppg: results.pts / games.length,
  // ...
});

const results = buildStatsObject(games.reduce(tallyGames));

或者,您可以构建您的 stats 对象,将所有值设置为 0(或某个归零值),并将其作为第二个参数包含在 reduce... ...但是prev 始终是您的年度统计数据,而不是实际游戏,因此您必须处理它。

【讨论】:

    【解决方案3】:

    Reduce 不是最合适的计算方法,因为您需要保持运行总计才能执行我猜您正在尝试执行的计算。

    可以计算每次迭代的总和以计算新的,但这非常难看并且容易出现浮点舍入错误。通过添加一些运行总属性,您可以在修复一些错误的变量名称后正确计算新值。

    games = [{
        game_id: 21700002,
        team_id: 1610612745,
        player_id: 201935,
        opponent_id: 1610612744,
        period: 'f',
        season: '2017',
        min: '36:24',
        fgm: 10,
        fga: 23,
        fg3m: 4,
        fg3a: 9,
        ftm: 3,
        fta: 4,
        oreb: 1,
        dreb: 5,
        ast: 10,
        blk: 0,
        stl: '1',
        to: 3,
        pf: 2,
        pts: 27,
        plus_minus: 1
      },
      {
        game_id: 21700002,
        team_id: 1610612745,
        player_id: 201935,
        opponent_id: 1610612744,
        period: 'f',
        season: '2017',
        min: '36:24',
        fgm: 10,
        fga: 23,
        fg3m: 4,
        fg3a: 9,
        ftm: 3,
        fta: 4,
        oreb: 1,
        dreb: 5,
        ast: 10,
        blk: 0,
        stl: '1',
        to: 3,
        pf: 2,
        pts: 27,
        plus_minus: 1
      },
      {
        game_id: 21700002,
        team_id: 1610612745,
        player_id: 201935,
        opponent_id: 1610612744,
        period: 'f',
        season: '2017',
        min: '36:24',
        fgm: 10,
        fga: 23,
        fg3m: 4,
        fg3a: 9,
        ftm: 3,
        fta: 4,
        oreb: 1,
        dreb: 5,
        ast: 10,
        blk: 0,
        stl: '1',
        to: 3,
        pf: 2,
        pts: 27,
        plus_minus: 1
      }
    ]
    
    
    
    totalGames = games.length
    
    var stats = games.reduce(function(prev, curr) {
      var tpts = (prev.tpts + curr.pts)
      var tast = (prev.tast + curr.ast)
      var treb = (prev.treb + curr.oreb + curr.dreb)
      var tfga = (prev.tfga + curr.fga)
      var tfgm = (prev.tfgm + curr.fgm)
      var tfg3a = (prev.tfg3a + curr.fg3a)
      var tfg3m = (prev.tfg3m + curr.fg3m)
      return {
        tpts: tpts,
        tast: tast,
        treb: treb,
        tfga: tfga,
        tfgm: tfgm,
        tfg3a: tfg3a,
        tfg3m: tfg3m,
        ppg: tpts / totalGames,
        apg: tast / totalGames,
        rpg: treb / totalGames,
        fgp: (tfgm / tfga) * 100,
        fg3p: (tfg3m / tfg3a) * 100
      }
    
    }, {tpts: 0, tast: 0, treb: 0, tfga: 0, tfgm: 0, tfg3a: 0, tfg3m: 0, ppg: 0, apg: 0, rpg: 0, fgp: 0, fg3p: 0});
    
    
    console.log(stats);

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      相关资源
      最近更新 更多