Я пытался этот вызов Codewars, и проблема заключалась в нахождении делителей числа, а затем вычислении суммы этих квадратов в квадрате. Я нашел два подхода к этой проблеме.
Первый подход основан на других вопросах Stackoverflow о нахождении суммы всех делителей и кажется сначала умным:
function divisorsSquared(n) {
// create a numeric sequence and then reduce it
return [...Array(n+1).keys()].slice(1)
.reduce((sum, num)=>sum+(!(n % (num)) && Math.pow(num,2)), 0);
}
Второй подход, который я использовал, заключался в использовании простого цикла for:
function divisorsSquared(n) {
var sum = 0;
for(var i = 1; i<= n; i++){
if(n % i === 0) sum += Math.pow(i,2);
}
return sum;
}
Теперь я заметил, что первый подход значительно медленнее второго и быстрый тест jsperf подтверждает это.
Мои вопросы: почему первый подход намного медленнее и какой подход предпочтительнее в производственном коде?
В Codewars я замечаю, что для многих задач существуют умные однострочные решения, использующие аналогичные методы массива. Как новичок, могут ли такие решения рассматриваться лучше, чем для циклов, даже если производительность хуже?