我試圖this Codewars challenge問題涉及找到一個數字的除數,然後計算這些除數的平方和。我發現了兩個解決這個問題的方法。Javascript性能:reduce()vs for-loop
第一種方法是基於對finding the sum of all divisors另一個#1的問題,似乎巧妙起初:
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;
}
現在我注意到第一種方法比第二種方法明顯慢,並且快速地確認了這一點。
我的問題是:爲什麼第一種方法慢得多,在生產代碼中哪種方法更可取?
關於Codewars我注意到,對於許多挑戰,使用類似數組方法的巧妙的單行解決方案。作爲初學者,即使性能更差,這種解決方案可能會被認爲比循環更好嗎?
如果你在看代碼,第一個使用一個構造函數,然後循環傳播,然後遍歷拿到鑰匙,然後遍歷切片,然後遍歷減少...第二個迭代...一次。 – adeneo
我沒有想到,但現在看起來很明顯。謝謝! –