JavaScript: цикл по массиву объектов и поиск суммы конкретного ключа с помощью функции Reduce - PullRequest
0 голосов
/ 31 мая 2019

У меня есть следующий объект ниже. Он содержит массив объектов. Каждый объект является супергероем, который содержит подробную информацию о супергерое.

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

  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, но не возвращает среднее значение. Что я делаю неправильно?

Примечание: я хочу использовать функцию уменьшения модификации для решения этой проблемы.

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Есть три ошибки:

  • У вас есть два return утверждения в коде.Таким образом, код не дойдет до второго, который получает среднее значение.
  • Вы используете reduce() неправильно.Вы нигде не используете accumulator.Вы используете reduce() как forEach()
  • Вам не нужно считать каждый объект в reduce() у вас уже есть массив length в виде obj.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))
0 голосов
/ 31 мая 2019

Вы возвращаете свою сумму прямо здесь, которая не учитывает ваше деление ....

Измените это на

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; // Just get rid of this

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