[20/28] Золотой мяч

Сводка
var getStatistics = function (players) {
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/players.reduce(function (acc, obj){ return acc + obj.goals;},0)*100);
  }
  return players;
};

Да то же самое получилось. Но кажется это самое логичное решение, если использовать только то, чему обучали на курсах. Только я доп переменные люблю использовать)

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

Подскажите пожалуйста, почему нужно использовать два цикла? Почему нельзя все засунуть в один цикл?

Потому что с помощью первого цикла мы считаем количество голов, а с помощью второго цикла мы, используя результат первого (сумма голов всех игроков), находим % от забитых голов. И если расчёт коэффициента полезности, можно проводить в первом цикле, потому что этот расчёт не предполагает поиск каких-то дополнительных данных, то с результативностью так не получится.
Как можно одновременно считать сумму голов всех игроков и % от него мне не ясно в силу того, что если все строки кода из обоих циклов поместить в один цикл, то на каждой итерации мы будем к общему количеству голов добавлять голы игрока[i] и полученное числу сразу же делить на личные голы этого игрока. В таком случае, параметр результативности будет правильным только для последнего игрока, потому что потому что только на последней итерации мы получим сумму Всех голов команды, а до этого будем делить players[i].goals на сумму голов, которая не будет полной (к примеру, если игроков будет 6, то голы players[5] делим на сумму голов первых пяти игроков, но ведь есть еще шестой игрок, мячи которого мы еще к общему количеству не прибавляли).

1 лайк

Мой вариант :
let getStatistics = (players) => {
let q = players.map((a)=>a.goals).reduce((a,b)=>a+b);
return players.map(a=>(a.coefficient = a.goals2+a.passes, a.percent = Math.round(a.goals100/q), a))
};

2 лайка

Решил через forEach

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

Мое решение:

let getStatistics = function (players) {

let goalsSum = 0;

for (let i = 0; i < players.length; i++) {
players[i].coefficient = (players[i].goals * 2) + players[i].passes;
goalsSum += players[i].goals;
}

for (let j = 0; j < players.length; j++) {
players[j].percent = Math.round(players[j].goals*100/goalsSum);
}

return players
}

Вот моё решение:

let obj1 = {
  name: 'Вася',
  goals: 5,
  passes: 5
}

let obj2 = {
  name: 'Петя',
  goals: 12,
  passes: 2
}

let obj3 = {
  name: 'Дюша',
  goals: 2,
  passes: 7
}

let array = [obj1, obj2, obj3];

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

getStatistics(array);

Рабочий код, проходит проверку.
let getStatistics = function (players) {
let totalGoals = 0;
for(let i = 0; i < players.length; i++){
totalGoals += players[i].goals;
};
for(let i = 0; i < players.length; i++){
players[i].coefficient = players[i].goals2 +players[i].passes;
players[i].percent = Math.round(players[i].goals/totalGoals
100);
}
return players;
};

Пока игрался на занятие слепил так:

let getStatistics = function (players) {
  let sum = players.reduceRight((previousValue, currentValue) => previousValue += currentValue.goals,0)
  for(player of players){
    player.coefficient = player.goals * 2 + player.passes
    player.percent =  Math.round(player.goals * 100 / sum)
  }
  return players
};

Моя Кода - намана =)

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

Здравствуйте, помогите разобраться плиз. Объясните откуда вы взяли players.passes и players.goals если они нигде ранее в коде не введены? При том код рабочий, но не пойму откуда код понимает что выполнять если ему не сказали до этого про goals и passes

let getStatistics = function (players) {
  let goalsSum = 0
  for (let i = 0; i < players.length; i++) {
    goalsSum += players[i].goals;
  }
  
  for (let 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) / goalsSum);
  };
  
  return players;
};

Друзья! Где ошибка?

// найдем сумму голов всеx игроков
let sumGoals = 0;
for (let j = 0; j < footbals.length;  j++) {
  sumGoals += footbals[j].goals;
  }
  
//найдем сумму всех пасов
let sumPasses  = 0;
for (let k =0; k < footbals.length; k++) {
  sumPasses += footbals[k].passes;
  }

let getStatistics = function (players) {
  // добавим новые свойства в объект 
  for(let i = 0; i < players.length; i++) {
    players[i].coefficient  = players[i].goals * 2 + sumPasses;
    players[i]. percent  = Math.round((players[i].goals / sumGoals) *100) ;
    
    // возвратим наш обект с новыми свойствами
    return players[i];
    }
  }

Справились почему так? додумались я надеюсб

Если не ошибаюсь, возвращаем массив return players без [i] и за циклом. И по поводу суммирования пассов не совсем уверен что правильно.

Моё решение

Спойлер

Этот текст будет скрыт

let getStatistics = function (players) {
  let sumOfGoals = 0;

  for (let i = 0; i < players.length; i++) {
    sumOfGoals += players[i].goals;
  }

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

Вот моё решение:

let getStatistics = function (players) {
  
 //Находим сумму всех голов
  let sumGoals = players.reduce((acc, item, index) =>  acc += players[index].goals, 0);
   
//Добавляем новые ключ:значение для каждого элемента
  players.map(function(value, index) {
    
    value.coefficient = (players[index].goals * 2) + players[index].passes;
    
    value.percent = Math.round((players[index].goals * 100) / sumGoals)
    
  });
//Возвращаем массив
return players;
}

Я так понимаю нет решения без использования двух циклов for и при это не используя всякие forEach и прочее, что ещё не было пройдено в рамках курса?