js 數組實現一個類似ruby的迭代器

來源:互聯網
上載者:User

分為如下幾節:

·基本實現

·在迭代中引用原來的對象,或者直接改變數組的值而不是返回一個新數組

·向迭代傳入無限多的參數

·基本實現
今天突然發現js的數組處理起來真是麻煩,代碼一些就是一大堆,相比起ruby的迭代器來真是遜色不少,主要是要寫的代碼太多了,也許是js有特殊的處理數組的方式,真是我不知道而已,但是我真的想自己給js實現一個類似ruby的迭代器的東東,而且實現起來也不難,那就開始動手吧.

真的應該慶幸js是動態語言啊,如果是靜態語言,實現起來很不方便(別說要我重新定義一個繼承自array的類),不過用js實現起來就簡單多了,直接給Array對象加一個方法即可,如下:

額呵呵,迭代器其實已經實現了......好簡單啊,是啊,不過這樣的確方便了不少哦,看下面的用法就知道了:

首先我們定義一個數組:

1:用法一:

迭代使用每個數組元素:

聲明:這裡可以縮寫成:aa.each(function(val){alert(val)});,以下的也同理,為了清晰,分開寫的

執行結果是依次彈出每個數組元素的值,哦呵,就是這麼簡單,不用寫可惡的for,如果代碼很多的時候,這點節省也會省出不少的代碼量哦

2:用法二:

迭代處理每個數組元素並返回一個處理後哦數組:

結果如何?如你所想,首先彈出的是"1,2,3,4",之後彈出的是"2,4,6,8",每個元素都被處理了,並且作為新數組返回,額呵呵,很簡單的功能,如果你覺得沒什麼用的話,那好吧,還是去寫for迴圈吧,如果你喜歡這種寫法,那好吧,還有很多可以改進的地方,也留給大家去探索,反正這樣目前對我來說已經足夠用來節省很多代碼了.

3:更多:

還可以給數組增加更多有用的方法,例如:隨機打亂順序(棋牌遊戲?)等,不過真希望js可以在方法名中包含更多的標點符號,那樣就可以定義 each?或者each!這種警示性方法了,可惜可惜

·在迭代中引用原來的對象,或者直接改變數組的值而不是返回一個新數組

我這裡有一個可以說是改進版的迭代器,因為我突然要在func函數裡引用原來的迭代對象,於是做了如下修改

變化並不大,也相容前面所講的所有功能,而且增加了對數組對象的引用

我們可以在func函數裡引用原來的數組對象,和當前元素的索引位置,這樣可以增加很多功能哦,首先可以直接修改原來數組的值,!!!不過如果你在func函數裡刪除了某個數組元素,可能會出現不可預料的錯誤哦!!!,下面來做個實驗,看看會出現什麼結果:

哦,我們在func函數裡刪除了值為2的元素,結果呢,依次彈出1,3,4,undefined,也就是迭代函數無法知道你的數組長度改變了,多迴圈了一次,如何解決這個問題呢?

初步想法是,判斷一下元素是否為空白,如果為空白,就不做任何操作,&&操作符的前面如果為假,就不會執行後面的語句.今天發現這種方法有所欠考慮,因為我漏處理了一個元素,仔細想想就知道了,所以需要在處理函數裡加一個offset變數,指引當前的位移量,每次刪除元素就將offset變數減一,索引以index+offset為準,這樣可以解決刪除元素的問題,但是不能解決增加元素的問題,所以這個迭代器裡不能動態增加數組元素,否則會出現錯誤,注意注意

先到此為止吧.

·向迭代傳入無限多的參數

又回來了,這次我們要讓這個迭代可以傳遞更多的有用的自訂參數,而不是系統自定的,當然,前面的所有操作都是被相容的,所有的修改都不會破壞前面的操作的相容性.

我們將主方法修改如下:

OK,加了個參數,只是一個參數,沒有什麼大驚小怪,但是它已經可以完成所有的參數傳遞了,看例子:

還是剛才的例子,我們要刪除數組中的一個元素,我們通過傳遞進來的參數來確定刪除哪個值,我們用一個對象作為參數傳進來,這個對象是個json對象,歐耶,json可以承載任意多的參數,想傳多少就傳多少,不是很簡單麼,好像我們已經實現了很多功能了.但是還沒有完,更多的需要自己去探索.

只用拓展ie的forEach就行了,ff下已經支援了,而且你這種寫法貌似效率很低

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.