Среднее в Javascript - PullRequest
       0

Среднее в Javascript

7 голосов
/ 11 марта 2020

Тогда мне нужна функция, которая получает средний максимум. Вот что я сделал:

    function getAverageHeight() {
        let total_height = 0;
        let average_height = statues.length;

        if (statues.length > 0) {
            for (let i = 0; i < statues.length; i++) {
                let statue = statues[i];

                total_height += isNaN(statues.height) ? 0 : statue.height;
            }
        average_height = (total_height / statues.length).toFixed(2);
         }
       return average_height;
       } 

Но когда я проверял это, я получил NaN как ответ, а не среднее. Что я тут не так сделал? Может кто-нибудь дать подсказку?

Ответы [ 4 ]

3 голосов
/ 12 марта 2020

Многие решения здесь довольно хороши, но есть крайние случаи с isNan, такие как true и ''. Сначала безопаснее использовать parseInt. Вот решение, которое отбрасывает крайние случаи и возвращает среднее.

let statues = [];
function createStatue(name, city, heightInMeters) {
  statues.push({
    name,
    city,
    heightInMeters
  });
}

// create statues + edge cases inputs
createStatue("Number", "New York", 46);
createStatue("Decimal", "Florence", 5.17);
createStatue("String", "Florence", '123');
createStatue("True", "Boston", true);
createStatue("Empty", "New York City", '');


function getAverageHeight() {
  // Filter out bad cases here
  const filteredStatues = statues.filter((x) => {
    let num = parseInt(x.heightInMeters);
    return !isNaN(num);
  });

  const total = filteredStatues.reduce((acc, x) => {
    return acc+parseInt(x.heightInMeters);
  }, 0);
  return (total/filteredStatues.length).toFixed(2);
}

console.log(getAverageHeight());

РЕДАКТИРОВАТЬ: OP предоставил исходный код. Глядя на это, есть некоторые странности.

heightInMeters: heightInMeters,
  isLongerThan: function (other_statue) {            
    return this.highInMeters > other_statue.hightInMeters;

Похоже, здесь несколько опечаток, и код не должен запускаться.

2 голосов
/ 11 марта 2020

Вы хотите использовать

isNaN(statue.height)

Вместо

isNaN(statues.height)
1 голос
/ 12 марта 2020

Вы без необходимости устанавливаете значение по умолчанию Average_height и случайно набираете «статуи» вместо статуи.

function getAverageHeight() {
    let total_height = 0;
    let average_height = "0.00"; // ⭐ This will be returned when statues.length <= 0

    if (statues.length > 0) {
        for (let i = 0; i < statues.length; i++) {
            let statue = statues[i];
            total_height += isNaN(statue.height) ? 0 : statue.height; // ⭐ You meant statue.height, not statues.height
        }
        average_height = (total_height / statues.length).toFixed(2)
    }
    return average_height;
}

Или можете использовать Array.reduce , например так:

let getAverageHeight = () => (statues.reduce((a, b) => {
    a += b.height;
    return a
}, 0) / statues.length || 0).toFixed(2)
1 голос
/ 11 марта 2020

Создайте функцию, которая накапливает объекты в массиве при каждом ее вызове.

Создайте отдельную усредненную функцию, которая принимает этот накопленный массив и возвращает средние результаты высоты, если высота - число

let statues = [];
function createStatue(name, city, height) {
  return statues = [...statues, {
    name,
    city,
    height
  }]
}
// call functions to populate array
createStatue("Statue of Liberty", "New York", 46);
createStatue("Christ the Redeemer", "Rio de Janeiro", 30);
createStatue("David", "Florence", 5.17);
createStatue("Little Mermaid", "Copenhagen", 1.25);
createStatue("Winged Victory", "Paris", 2.44);
createStatue("Venus de Milo", "Paris", 2);


function getAverageHeight() {
  const total = statues.reduce((acc, x) => {
    if (!isNaN(x.height)) {
      acc.counter += 1
      acc.sum += x.height;
    }
    return acc;
  }, {
    sum: 0,
    counter: 0
  })
  return (total.sum / total.counter).toFixed(2)

}

console.log(getAverageHeight())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...