Объекты [21/30] Десятая программа "Золотой мяч"


Объясните, пожалуйста, почему не работает такая запись?

var getStatistics = function (players) {
   for (var i = 0; i < players.length; i++) {
       var totalGoals = totalGoals + players[i].goals;
       }
   for (var i = 0; i < players.length; i++) {
       players[i].coefficient = players[i].goals * 2 + players[i].passes;
       players[i].percent = Math.round(players[i].goals*100/totalGoals);
       }
   return players;
};

var totalGoals = totalGoals + players[i].goals;
вот из-за этой записи у вас в процентах появляется Null

выведите объявление переменной за цикл (с присвоением стартового значения 0), а внутри оставьте лишь
totalGoals += players[i].goals;

Почему так происходит? (простыми словами - низя объявлять переменную и тут же присваивать её себе же).
по логике вещей в проценты попадает значение NaN
но от нас в проверке скрыта часть кода, я полагаю это
var str = JSON.stringify(players);
а приведенный объект к JSON-строке поменял просто NaN на null

1 лайк

Ох, сам бы никогда не допер, спасибо большое. Объявил переменную, теперь все заработало. Я целый день убил блин, не мог понять что было не так. Даже дописывал отдельно три объекта-игрока, вызывал вручную функцию, все как по заданию сделал, все равно не получалось пройти, голову сломал, логика то вроде бы верная была. Значит проще и безопаснее делать так, по топорному, спасибо!

Итог теперь такой, все работает

Код
var getStatistics = function (players) {
  var totalGoals = 0;
    for (var i = 0; i < players.length; i++) {
    totalGoals += players[i].goals;
  }
  for (var i = 0; i < players.length; i++) {
    players[i].coefficient = players[i].goals * 2 + players[i].passes;
    players[i].percent = Math.round(players[i].goals*100/totalGoals);
  }
  return players;
};

Вам хорошо! А у меня вообще кнопка тестирования исчезла))) не могу отправить :roll_eyes:

Была ошибка, но её уже исправили, сорри.

Кексу простительно! Мы ж понимаем: март на дворе)))

1 лайк
const getStatistics = function (players) {
  const sumGoals = players.reduce((acc, curr) => acc + curr.goals, 0);

  return players.map(item => {
    item.coefficient = item.goals * 2 + item.passes;
    item.percent = Math.round(item.goals * 100 / sumGoals);
    return item;
  })
};

Ооооочень странная глава, доработайте её пожалуйста.
До этого задания нам “объясняли” как объявлять объекты, так почему в этом задании их объявлять не нужно :thinking: и как я должен до этого догадаться?
И все 19 страниц до этого я бы не понял если бы не люди в комментариях.
Причём до этой главы всё было очень понятно

4 лайка

О каком объекте идёт речь?

вот строчка из задания " Каждый футболист в этом массиве описывается объектом с тремя полями: имя (свойство name ), забитые голы (свойство goals ) и голевые пасы (свойство passes )."
Вы или добавьте эти объекты или напишите что их создавать не нужно.
Потому как не логично давать первое задание таким. Где в итоговом коде не видно объект :

код

var getStatistics = function (players) {
var sumGoals = 0;
for(var i=0;i<players.length;i++){
sumGoals+=players[i].goals
}
for(var i=0;i<players.length;i++){
players[i].coefficient = players[i].goals2+players[i].passes
players[i].percent = Math.round((players[i].goals
100)/sumGoals);
}
return players
};

так они подставляются в результате проверки. если вы до сих пор не заметили, проверка вызывает функцию со своими аргументами. вы их не описываете, но структурно программа должна совпадать со структурой передаваемого аргумента, не важно, массив ли это, примитив или объект.
это как бы само собой разумеющееся было, начиная с первых заданий по js.

обновил свой код
const getStatistics = (players) => 
  players.map(player => {
    player.coefficient = player.goals * 2 + player.passes;
    player.percent = Math.round(player.goals * 100 / players.reduce((p, c) => c.goals + p, 0));
    return player;
  });
1 лайк

почему показывает что не проходит проверку? ответы одни и те же.

У меня ваш код проходит проверку:

Возможно, где-то буква в русской раскладке набрана. Если нет, пришлите код текстом.

var getStatistics = function (players) {
var sumGoals = 0;
for (var i = 0; i < players.length; i++) {
sumGoals += players[i].goals
};
for (var i = 0; i < players.length; i++) {
players[i].coefficent = (players[i].goals * 2) + players[i].passes;
players[i].percent = Math.round((players[i].goals * 100) / sumGoals);

};
return players;
};

вот код, что-то не могу понять в чем дело

Нашла опечатку — в свойстве coefficient.

let getStatistics = (players) => {
let sumgoals= players.map(a=>a.goals).reduce((a,b)=>a+b);
let coefficient = x =>x.goals2+x.passes;
let percent = x => Math.round(x.goals
100/sumgoals);

return players.map(a=>{a.percent = percent(a);a.coefficient= coefficient(a); return a});
};

Мое решение

Я объявила игроков сама, чтобы было легче писать код.

var playersFootball = [
  { name: "Кекс",
    goals: 0,
    passes: 0 },
    
  { name: "Рудольф",
    goals: 0,
    passes: 0 },
  
  { name: "Зигмунд",
    goals: 0,
    passes: 0 }
  ];

var getStatistics = function (players) {
    var sumGoals = 0;
    for(var x = 0; x < players.length; x++){
        sumGoals += players[x].goals;
    }
    for(var i = 0; i < players.length; i++){
    players[i].coefficient = (players[i].goals * 2) + players[i].passes;
    players[i].percent = Math.round(players[i].goals * 100 / sumGoals);
    }
  return players;
  };

getStatistics(playersFootball);

Спасибо Вам огромное!
Если бы я не наткнулся на Ваш коммент, то так и не понял бы, что не нужно объекты объявлять!
Без них все заработало.