javascript
浅谈JS的数组遍历方法
上面的代碼會依次輸出1, 2, 3, 4, 5,是不是很有意思,遍歷一個數組連for循環都不用自己寫了。_.each()方法遍歷數組非常好用,但是它的內部實現一點都不難。下面就一起來看看到底是如何實現_.each()的。在這之前,我們先來看看_.each()的API。_.each()的一般是如下調用的:
_.each(arr, fn, context);它接收3個參數,
第一個是需要遍歷的數組(其實是對象也是可以的,這個后面我們再一起來討論); 第二個是它的回調函數(這個回調函數可以傳入3個參數,如:function(el, i, arr),分別是當前元素、當前索引和原數組); 第三個是回調函數需要綁定到的上下文,即指定回調函數fn的this值。 好啦,需求已經非常明確了,開始干活啦! 我們先來實現一個最簡單的_.each(),它不能夠修改上下文this的,接收兩個參數,代碼如下: var _ = {}; // 假設這就是underscore哈// 一個最簡單的_.each方法的實現 _.each = function(arr, fn) {for(var i = 0; i < arr.length; i++) {fn(arr[i], i, arr);}return arr; // 把原數組返回 }怎么樣?是不是很簡單呢?只是用一個for循環,不停的調用回調函數即可,短短幾行代碼就搞定了,相信沒有朋友看不懂的哈!下面我們來測試一下看能不能正常工作:
var arr = [1, 2, 3, 4, 5]; _.each(arr, function(el, i, arr) {console.log(el); });在瀏覽器打開,然后控制臺就會看到有正確的輸出了。
這么簡單的代碼一點意思也沒有,接下來看一個比較有點挑戰性的例子哈。比如,數組arr有個sum屬性,我們需要把數組所有的元素求和之后存放到sum里面,如下: var arr = [1, 2, 3, 4, 5]; arr.sum = 0; // sum屬性用來存放數組元素之和 _.each(arr, function(el, i, arr) {this.sum += el; });這時候,回調函數里面用到了this,如果不綁定的話,this默認就是window,這不是我們想要的,我們希望它綁定到數組arr上面。call或者apply可以實現這個功能,代碼如下:
var _ = {}; // 假設這就是underscore哈// bind,接收兩個參數fn和context // 把fn綁定到context上面 var bind = function(fn, context) {context = context || null;return function(el, i, arr) {fn.call(context, el, i, arr);} }// _.each _.each = function(arr, fn, context) {// 調用bind方法,把fn綁定到context上面fn = bind(fn, context);for(var i = 0; i < arr.length; i++) {fn(arr[i], i, arr);}return arr; }// 測試用例: var arr = [1, 2, 3, 4, 5]; arr.sum = 0; // sum屬性用來存放數組元素之和 _.each(arr, function(el, i, arr) {this.sum += el; }, arr);console.log(arr.sum); // 15好啦,這個_.each()已經足夠強大了,可以正常遍歷數組,還可以任意指定this值改變回調函數的上下文。但是,我們前面有提到過,Underscore的_.each()還可以遍歷對象的 ,這個實現也不難,只要判斷一下傳入的第一個參數是對象還是數組,如果是數組就像我們一樣遍歷,否則如果是對象,使用對象的for...in循環遍歷就行了。有興趣的可以自己試試,或者看看underscore的源碼。
注意:自從ES5標準以來,原生數組就已經具有了Array.prototype.forEach、Array.prototype.Map等遍歷方法了,在項目中可以使用原生的。轉載于:https://www.cnblogs.com/yugege/p/5584672.html
總結
以上是生活随笔為你收集整理的浅谈JS的数组遍历方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在全局中调用类的静态成员函数
- 下一篇: [BZOJ1015] [JSOI2008