寫這篇文章的原因我目前做的項目很少用到演算法,於是這方面的東西自然就有點兒生疏。最近的一次編碼中遇到了從數組中獲取最大值的需求,當時我不自覺的想到了js的sort()函數,現在想來真是有些“罪過”,當時自己內心還覺得有些得意:“嗯,我用js的內置方法解決了一個通常需要用排序演算法才能解決的問題,代碼簡短 ...
寫這篇文章的原因
我目前做的項目很少用到演算法,於是這方面的東西自然就有點兒生疏。最近的一次編碼中遇到了從數組中獲取最大值的需求,當時我不自覺的想到了js的sort()函數,現在想來真是有些“罪過”,當時自己內心還覺得有些得意:“嗯,我用js的內置方法解決了一個通常需要用排序演算法才能解決的問題,代碼簡短,不用去寫頭疼的遍歷和比較,可讀性還好。。。”。內心戲很重,對吧。咳咳,哎,自己還是嫩而且還懶。js內生的sort函數也是用到了排序,詳見segmentfault上的這個js內生sort()函數是如何實現的。
奇技淫巧
js中有很多“奇技淫巧”,有時我會常常刻意去用這些“奇技淫巧”(註意,我不是在反對用它,只是有時其實沒必要用)。比如,求數組中的最大值,js中Array沒有原生的求最大值的方法,但是Math有呀:
1 Math.max(22, 79, 33) // 79
如果數組想用也是可以用的呀:
1 var arr = [22, 79, 33]; 2 Math.max.apply(null, arr); // 79
或者不用apply方法,你把數組轉換成字元串,用eval()方法來執行拼接為“Math.max(num1, num2, num3)”的js代碼也是可以的:
1 var max = eval("Math.max(" + arr.join(',') + ")"); // 79
如果這個你沒想到,你就用我上面提到的sort()函數也是可以的呀:
1 var arr = [22, 79, 33]; 2 3 var getMax = function(arr) { 4 var copyArr = JSON.parse(JSON.stringify(arr)); 5 var len = copyArr.length; 6 7 copyArr.sort(); 8 9 return copyArr[len - 1]; 10 }; 11 12 getMax(arr); // 79
笨方法
看到現在,你一定驚嘆js的強大,但有時過於依賴它的這種“奇技淫巧”會讓自己處於一種“自大”的狀態,畢竟js的強大不代表你自己的編碼水平強大。所以返璞歸真吧,用笨方法來鍛煉下自己的腦力:
1 var arr = [22, 79, 33]; 2 var getMax = function(arr) { 3 var len = arr.length, 4 max = arr[0]; 5 6 while (len--) { 7 if (max >= arr[len]) { 8 continue; 9 } 10 11 max = arr[len]; 12 } 13 14 return max; 15 }; 16 getMax(arr); // 79
註意:這篇文章最初發表在我自己折騰的博客站點上:js求數組的最大值--奇技淫巧和笨方法,該博客用了一位前輩開源的源碼,基於thinkjs和vuejs開發,歡迎大家來逛逛。