Andrew Garfield, как что? Циклом проходит по свойствам. И сравнивает с базисным значением (max) и если значение n больше чем max, то это значение становится max, иначе базис остается неизменным. А чтобы понять, почему сравнивание идет не просто max и n, а max[1] и n[1], надо понимать, что дает вам Object.entries()...
Думаю доходчиво
Шохрух Шаймардонов, вставлю свои пять копеек, может в этом затык понимания reduce.. Примерно(!) так выглядит её прототип:
Array.prototype.reduce = (userHandler, defaultValue) => {
let accumulatedValue = defaultValue
for (i = 0; i < this.length; i++)
accumulatedValue = userHandler(accumulatedValue, this[i], i)
return accumulatedValue
}
В данном примере переменная max это аккумулируемое значение итератора - ей присваивается значение, возвращаемое переданной в качестве аргумента функцией обработчиком(userHandler) на каждом шаге итерации. Таким образом, результатом функции reduce является значение, которое вернула функция обработчик на последнем шаге итерации. Это значит что вы можете вертеть ей теперь как хотите, а не только для суммирования элементов как Вы думали(ну эт конечно лишь предположение Вашего заблуждения)
Пример с sort, показавшись простым и более лаконичным, выполняет большее количество вычислений на каждом этапе, потому просьба отметить ответ с reduce решением..
P.S. Object.entries(obj) возвращает массив [ [key, value], ... ]
0xD34F, Вам ли не знать, что часто (!!) одна строка бывает загвоздкой в работе всего кода. Я к тому что даже она может оказаться сложной для понимания. Ясно, что для вас это уже детский сад, но для меня пока что это не так просто. В любом случае спасибо за решение.