javascript减少不工作 - 尝试在数组内部汇总多个对象值

时间:2018-01-09 23:34:49

标签: javascript reduce

游戏数组中有很多对象,我想在所有计算中返回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);

3 个答案:

答案 0 :(得分:0)

您需要指定要减少的初始参数 -

.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 
}

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

答案 1 :(得分:0)

Reduce使用您返回的内容prev。 例如,如果您从string返回reduce,则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(或者某些置零值),并将其作为第二个参数包含以减少... ......但是prev总是你的年份数据,而不是真正的游戏,所以你必须处理它。

答案 2 :(得分:0)

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