論壇裏有同學問了一個比較基礎的js數組處理,就是在一個亂序且有重複值的數組中,找到最大的三個值。在回答這個問題過程中,因爲沒有實際測試,我連續犯了幾個低級錯誤,現在記錄下來,給自己一個警醒.
第一次回答的代碼:
function getMax(list, num){
var result = [];
list.sort().reverse().foreach((p)=>{
if(result.lenth < num){
if(result.indexOf(p) != -1){
result.push(p);
}
}
})
return result;
}
提交後,立馬發現判斷語句寫反了,應該用等號,修改之後再提交,又發現forEach敲錯了,大寫的E敲成了小寫的,並且length少敲了一個g。。。
然後想想,做了一個測試,發現返回結果是空數組,立馬反應過來,forEach裏面封裝的是匿名函數,異步執行導致的,唉。。。。
一個小問題,出了幾個低級錯誤。。。。真丟臉。。。。
後來把forEach遍歷改成for循環遍歷,得到了正確的結果。
不過心裏始終有個疙瘩,現在lambda語法很流行,forEach比for要優雅一些,有沒有辦法用forEach也能得到需要的結果呢?
於是繼續改造,給forEach添加await語法,強制同步。雖然代碼看起來有些奇怪,但也能解決問題,並且可以看做是學習js基礎語法的一個良好例題吧:
function getMax(list, num){
var result = [];
list.sort().reverse().forEach(async (p)=>{
if(result.length < num){
if(result.indexOf(p) == -1){
await result.push(p);
}
}
})
return result;
}