JavaScript:循环遍历对象数组并使用Reduce函数查找特定键的总和

标签 javascript object callback sum reduce

我下面有以下对象。它包含一个对象数组。每个对象都是一个 super 英雄,其中包含有关 super 英雄的详细信息。

const superheroes = [
      {
        name: 'Bruce Wayne',
        alias: 'Batman',
        powerLevel: 50,
        universe: 'DC Comics',
        race: 'Human',
      },
      {
        name: 'Wade Wilson',
        alias: 'Deadpool',
        powerLevel: 90,
        universe: 'Marvel Comics',
        race: 'Mutant',
      },
      {
        name: 'Peter Parker',
        alias: 'Spiderman',
        powerLevel: 70,
        universe: 'Marvel Comics',
        race: 'Human',
      },
      {
        name: 'Kristin Wells',
        alias: 'Superwoman',
        powerLevel: 99,
        universe: 'DC Comics',
        race: 'Kryptonian',
      },
      {
        name: 'Barry Allen',
        alias: 'The Flash',
        powerLevel: 80,
        universe: 'DC Comics',
        race: 'Human',
      },
      {
        name: 'Diana Prince',
        alias: 'Wonder Woman',
        powerLevel: 90,
        universe: 'DC Comics',
        race: 'Human',
      },
      {
        name: 'Ororo Munroe',
        alias: 'Storm',
        powerLevel: 85,
        universe: 'Marvel Comics',
        race: 'Mutant',
      },
      {
        name: 'Helen Parr',
        alias: 'Elastigirl',
        powerLevel: 70,
        universe: 'Dark Horse Comics',
        race: 'Human',
      },
    ];

我想找到所有 super 英雄的平均力量水平。

我尝试了下面的代码:

function powerLevelAverage(obj){

  let sum = 0; 
  let objCount = 0;

  return obj.reduce((accumulator, element) => {

    objCount += 1; 
    console.log(objCount)

    sum = accumulator + element.powerLevel

    return sum; 

  }, 0)
  return Math.round(sum/objCount); 
}


const averagePowerLevel = powerLevelAverage(superheroes);

averagePowerLevel

该代码似乎返回 634 的总和,但不返回平均值。我究竟做错了什么?

注意:我想使用reduce修改函数来解决这个问题。

最佳答案

存在三个错误:

  • 代码中有两个 return 语句。因此代码不会到达第二个获得平均值的代码。
  • 您使用reduce()的方式是错误的。您没有在任何地方使用累加器。您正在使用 reduce() ,例如 forEach()
  • 您不需要计算 reduce() 中的每个对象,您已经拥有 obj.length 形式的数组的 length

更简洁的代码就可以了。

function powerLevelAverage(obj){
  return Math.round(obj.reduce((ac,a) => ac + a.powerLevel,0)/obj.length)
}

工作片段:

const superheroes = [ { name: 'Bruce Wayne', alias: 'Batman', powerLevel: 50, universe: 'DC Comics', race: 'Human', }, { name: 'Wade Wilson', alias: 'Deadpool', powerLevel: 90, universe: 'Marvel Comics', race: 'Mutant', }, { name: 'Peter Parker', alias: 'Spiderman', powerLevel: 70, universe: 'Marvel Comics', race: 'Human', }, { name: 'Kristin Wells', alias: 'Superwoman', powerLevel: 99, universe: 'DC Comics', race: 'Kryptonian', }, { name: 'Barry Allen', alias: 'The Flash', powerLevel: 80, universe: 'DC Comics', race: 'Human', }, { name: 'Diana Prince', alias: 'Wonder Woman', powerLevel: 90, universe: 'DC Comics', race: 'Human', }, { name: 'Ororo Munroe', alias: 'Storm', powerLevel: 85, universe: 'Marvel Comics', race: 'Mutant', }, { name: 'Helen Parr', alias: 'Elastigirl', powerLevel: 70, universe: 'Dark Horse Comics', race: 'Human', }, ];

function powerLevelAverage(obj){
  return Math.round(obj.reduce((ac,a) => ac + a.powerLevel,0)/obj.length)
}

console.log(powerLevelAverage(superheroes))

关于JavaScript:循环遍历对象数组并使用Reduce函数查找特定键的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56398517/

相关文章:

javascript - 您可以动态地将局部变量添加到函数中吗?

javascript - 使用类创建模块化 TypeScript 库

javascript - 为什么汉诺塔中的 'disc' 值在 'disc' 次调用中不会递减为 0?

android - BaseActivity对象为null,onAttach方法在BaseFragment中不起作用

python - Keras 中的回调异常 - Tensorflow 2.0 - Python

javascript - Angular2 - 如何在按键时更改选定的 <select> 元素选项?

python - 构造一个类来展平 python 列表

objective-c - 不知道为什么出现 "EXC Bad Access"错误

javascript - 当另一个函数完成时暂停函数

带参数的 Python Matplotlib 回调函数