停止使用迴圈 教你用underscore優雅的寫程式碼
你一天(一週)內寫了多少個迴圈了?
var i; for(i = 0; i < someArray.length; i++) { var someThing = someArray[i]; doSomeWorkOn(someThing); }
這當然無害,但這種寫法非常醜而且奇怪,這也不是真正需要抱怨的。但這種寫法太平庸了。
var i, j; for(i = 0; i < someArray.length; i++) { var someThing = someArray[i]; for(j = 0; j < someThing.stuff.length; j++) { doSomeWorkOn(someThing.stuff[j]); } }
在擴充套件糟糕的程式碼,在你丟擲一大堆if前,你已經精神錯亂了。
我在兩年裡沒有寫一個迴圈(loop)。
“你在說什麼?”
這是真的,一個冷笑話。其實不是一個都沒有(好吧,我確實寫了幾個),因為我不寫迴圈(loops),我的程式碼更容易理解。你
怎麼做的呢?
_.each(someArray, function(someThing) { doSomeWorkOn(someThing); })
或者更好一點:
_.each(someArray, doSomeWorkOn);
這就是underscorejs所做到的。乾淨,簡單,易讀,短,沒有中間變數,沒有成堆的分號,簡單非常優雅。
這是另外一些例子。
var i, result = []; for(i = 0; i < someArray.length; i++) { var someThing = someArray[i]; // 打到這,我已經手疼了 if(someThing.isAwesome === true) { result.push(someArray[i]); } }
同樣,一個使用迴圈浪費時間的典型用例。即便這些網站是宣傳禁菸和素食主義的,看到這些程式碼我也感到義憤。看看簡單的寫法。
var result = _.filter(someArray, function(someThing) { return someThing.isAwesome === true; })
像underscore中的filter(過濾)的名字那樣,隨手寫的3行程式碼就可以給你一個新的陣列(array)。
或者你想把這些陣列轉換成另外一種形式?
var result = _.map(someArray, function(someThing) { return trasformTheThing(someThing); })
上面三個例子在日常生活中已經夠用了,但這些功能還不足矣讓underscore放到檯面上。
var grandTotal = 0, somePercentage = 1.07, severalNumbers = [33, 54, 42], i; // don't forget to hoist those indices; for(i = 0; i < severalNumbers.length; i++) { var aNumber = severalNumbers[i]; grandTotal += aNumber * somePercentage; }
underscore版本
var somePercentage = 1.07, severalNumbers = [33, 54, 42], grandTotal; grandTotal = _.reduce(severalNumbers, function(runningTotal, aNumber) { return runningTotal + (aNumber * somePercentage); }, 0)
這個剛開始看上去可能有點怪,我查了下關於reduce的文件,知道了它的存在。因為我拒絕使用迴圈,所以它是我的首選。上面這些東西僅僅是入門,underscorejs庫還有一大堆牛B的功能。
30天不使用迴圈的挑戰。
在一下一個30天裡,不要使用任何迴圈,如果你看到一堆討厭和粗糙的東西,用each或者map將他們替換掉。再用一點reducing。
你需要注意到,Underscore是通往函數語言程式設計的。一種看得見,看不見的方式。一條很好的途徑。
OurJS注*目前現代瀏覽器已經支援each, filter, map, reduce方法,但underscore庫可以實現對舊版IE的相容,下面是使用ES5原生方法寫的例子:
[3,4,5,3,3].forEach(function(obj){ console.log(obj); }); [1,2,3,4,5].filter(function(obj){ return obj < 3 }); [9,8,5,2,3,4,5].map(function(obj){ return obj + 2; }); [1,2,3,4,5].reduce(function(pre, cur, idx, arr) { console.log(idx); //4 個迴圈: 2-5 return pre + cur; }); //15 //sort方法同樣很有用 [9,8,5,2,3,4,5].sort(function(obj1, obj2){ return obj1 - obj2; });
相關文章
- 如何優雅地改善程式中for迴圈
- 如何寫出優雅的程式碼?
- 寫出優雅的js程式碼JS
- 編寫更優雅的 JavaScript 程式碼JavaScript
- 如何用 SpringBoot 優雅的寫程式碼Spring Boot
- 【優雅寫程式碼系統】springboot+mybatis+pagehelper+mybatisplus+druid教你如何優雅寫程式碼Spring BootMyBatisUI
- 如何寫出優雅耐看的JavaScript程式碼JavaScript
- 編寫優雅程式碼的最佳實踐
- 如何提高Java程式碼質量-優雅的寫程式碼Java
- 優雅的程式碼
- golang如何優雅的編寫事務程式碼Golang
- 在 JavaScript 中優雅的提取迴圈內的資料JavaScript
- 30個python教你學會優雅的寫程式碼Python
- 我是如何將業務程式碼寫優雅的
- PHPer這樣寫程式碼也許更優雅PHP
- 助您寫出優雅的Java程式碼七點建議Java
- 如何用 es6+ 寫出優雅的 js 程式碼JS
- 看promise教你如何優雅的寫js非同步程式碼PromiseJS非同步
- 程式分析與優化 - 6 迴圈優化優化
- 3.1 spring5原始碼系列--迴圈依賴 之 手寫程式碼模擬spring迴圈依賴Spring原始碼
- 如何優雅的打包前端程式碼前端
- 如何在 Swift 中優雅的處理閉包導致的迴圈引用Swift
- 如何優雅的寫Markdown
- 類的優雅寫法
- 怎麼讓程式碼不再臃腫,寫的像詩一樣優雅
- 寫了多年的Java,直到看到Kotlin,原來程式碼可以如此優雅!JavaKotlin
- Guava - 拯救垃圾程式碼,寫出優雅高效,效率提升N倍Guava
- 程式碼日數:高階迴圈
- 如何編寫優雅的DockerfileDocker
- 如何優雅地寫註釋:找到程式碼註釋的黃金平衡點
- 想寫出優雅的程式碼?試試這些ES6小tips
- 你的 JS 程式碼本可以更加優雅JS
- 那些優雅靈性的JS程式碼片段JS
- 【優雅程式碼】07-spring下的優秀工具類Spring
- 那些坑你沒商量的程式碼死迴圈
- 9條消除if...else的錦囊妙計,助你寫出更優雅的程式碼
- 幾個簡單的技巧讓你寫出的vue.js程式碼更優雅Vue.js
- 替代 for 迴圈,讓 Python 程式碼更 pythonic !Python
- 程式設計師筆記|如何編寫優雅的Dockerfile程式設計師筆記Docker