Объекты. Уроки 1 - 19. Кажется код не доработан

Как мне показалось в код который нас учат писать в этих уроках закрался баг. До этих курсов с js не сталкивался, поэтому могу ошибаться, прошу тапками не кидать.

Суть вот в чем:
Как мы знаем программа в итоге должна вернуть список победителей и число их очков (если максимальный результат одинаков у нескольких игроков) и одного победителя и число его очков (если одинаковых максимальных результатов нет).

При определенных обстоятельствах программа может вернуть список победителей с разным числом очков, что противоречит здравому смыслу, т.к разных максимальных результатов быть не может

Ошибка, на мой взгляд, кроется в этой функции, в условии, после else

Фрагмент кода

var getWinners = function (players) {
var winners = [];
var max = players[0];

for (var i = 0; i < players.length; i++) {
var currentPlayer = players[i];
if (currentPlayer.points > max.points) {
max = currentPlayer;
winners = [max];
} else if (currentPlayer.points === max.points) {
winners.push(currentPlayer);
}
}

return winners;
};

Нужная нам строка

if (currentPlayer.points === max.points) {
winners.push(currentPlayer);
}

Если очки текущего игрока равны максимальным очкам, то этого игрока так же записывают в массив с победителями

Рассмотрим такую ситуацию
Допустим у нас 9 игроков, у каждого по 1 попытке, в игре 2 кости. Игроки кинули кости и массив с случайно выпавшими очками получился такой [3, 5, 2, 11, 10, 11, 4 ,12 , 7] (по порядку от первого игрока к последнему)

Изначально максимальным результатом принят результат первого игрока (3 очка) и он сравнивается с остальными результатами, если находится результат выше, то максимальный результат переписывается

При выполнении цикла сначала максимальный результат заменяется на 5 (игрок 2), затем на 11 (игрок 4). При сравнении максимального результата (11 очков) и результата игрока 6 (тоже 11 очков) выполняется условие currentPlayer.points === max.points и выполняется команда записи в массив с победителями.

winners = [{игрок 4, 11 очков}, {игрок 6, 11 очков}]

Но цикл продолжается дальше и вот доходит до сравнения максимального результата с результатом игрока 8 (12 очков), выполняется условие currentPlayer.points > max.points и массив winners принимает вид

winners = [{игрок 8, 12 очков}, {игрок 6, 11 очков}]

В итоге имеем двух победителей с разным числом очков

нет, когда цикл натыкается на значение 12, массив из двух значений winners = [{игрок 4, 11 очков}, {игрок 6, 11 очков}]
снова становится
winners = [max] (массив из 1 значения-объекта)
а после 12, условие (currentPlayer.points > max.points) не выполняется и winners все также имеет в себе 1 значение, то самое где 12.

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

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

1 лайк

Понял. Благодарю