[js高手之路] 設計模式系列課程 - 迭代器(1)

来源:http://www.cnblogs.com/ghostwu/archive/2017/08/16/7376071.html
-Advertisement-
Play Games

迭代器是指通過一種形式依次遍曆數組,對象,或者類數組結構中的每個元素. 常見的有jquery中的each方法, ES5自帶的forEach方法. 下麵我們就來自定義一個類似jquery或者ES5的迭代器方法 輸出結果: ["zhangsan", "lisi", "ghostwu"] "zhangsa ...


迭代器是指通過一種形式依次遍曆數組,對象,或者類數組結構中的每個元素. 常見的有jquery中的each方法, ES5自帶的forEach方法. 下麵我們就來自定義一個類似jquery或者ES5的迭代器方法

1         function each( arr, fn ) {
2             for( var i = 0, len = arr.length; i < len; i++ ){
3                 fn.call( arr, arr[i], i );
4             }
5         }
6         each( [ 'zhangsan', 'lisi', 'ghostwu' ], function( val, key ){
7             console.log( this, val, key );
8         });

輸出結果:

["zhangsan", "lisi", "ghostwu"] "zhangsan" 0 ["zhangsan", "lisi", "ghostwu"] "lisi" 1 ["zhangsan", "lisi", "ghostwu"] "ghostwu" 2

二、利用迭代器,判斷兩個數組的長度和對應的位置的值是否相等

 1         function each( arr, fn ) {
 2             for( var i = 0, len = arr.length; i < len; i++ ){
 3                 fn.call( arr, arr[i], i );
 4             }
 5         }
 6         function isEqual( arr1, arr2 ){
 7             var flag = false;
 8             if( arr1.length != arr2.length ){
 9                 throw new Error( '數組的長度不相等' );
10             }
11             each( arr1, function( val, key ){
12                 if ( val != arr2[key] ) {
13                     throw new Error('數組的第' + (key+1) + '項不相等');
14                 }
15             });
16             return true;
17         }
18         console.log( isEqual( [ 10, 20, 30 ], [ 10, 20, 30 ] ) );

三、另一種迭代器

 1         function Iterator( obj ){
 2             var curInd = 0;
 3             var next = function(){
 4                 curInd += 1;
 5             };
 6             var isDone = function(){
 7                 return curInd >= obj.length;
 8             };
 9             var current = function(){
10                 return obj[curInd];
11             };
12             return {
13                 next : next,
14                 isDone : isDone,
15                 current : current
16             };
17         }
18         var obj = null;
19         obj = Iterator( [ 10, 20, 30 ] );
20         console.log( obj.current(), obj.isDone() ); // 10, false
21         obj.next();
22         console.log( obj.current(), obj.isDone() ); // 20, false
23         obj.next();
24         console.log( obj.current(), obj.isDone() ); // 30, false
25         obj.next();
26         console.log( obj.current(), obj.isDone() ); // undefined, true

四,使用上面的迭代器,改寫兩個數組的比較

 1         function Iterator( obj ){
 2             var curInd = 0;
 3             var next = function(){
 4                 curInd += 1;
 5             };
 6             var isDone = function(){
 7                 return curInd >= obj.length;
 8             };
 9             var current = function(){
10                 return obj[curInd];
11             };
12             return {
13                 next : next,
14                 isDone : isDone,
15                 current : current
16             };
17         }
18 
19         function compare( it1, it2 ){
20             while( !it1.isDone() && !it2.isDone() ){
21                 if( it1.current() != it2.current() ){
22                     throw new Error( '數組不相等' );
23                 }
24                 it1.next();
25                 it2.next();
26             }
27             return true;
28         }
29 
30         var Iterator1 = Iterator([ 10, 20, 30 ]);
31         var Iterator2 = Iterator([ 10, 20, 30 ]);
32 
33         console.log( compare( Iterator1, Iterator2 ) );

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.Caesar Shift Cipher(密碼) 說明:密碼學是編程中最有趣的分支之一。研究它的演算法通常以一種簡單的方法開始,這個方法是以著名的羅馬皇帝凱撒大帝命名的,他用這個方法來傳達他的軍事秘密。 我們將在這個問題中練習解密加密消息。這個演算法的想法很簡單。原文的每一個字母都被另一個字母替換。 ...
  • 學了面向對象三大特性繼承,多態,封裝。今天我們看看面向對象的一些進階內容,反射和一些類的內置函數。 ...
  • 為瞭解決大量數據緩存,消耗記憶體過多的問題,特別實現了文件緩存;該緩存主要是應用於多存少讀的情況,一般我們做緩存是實現將數據放在記憶體中或者資料庫中;放在記憶體中就會消耗很大記憶體,尤其在高併發大數據緩存時,更容易造成記憶體溢出,資料庫在很大程度能夠滿足我們需求,但是在極端情況,每秒產生很大數據時,資料庫速度 ...
  • ZBrush精簡版ZBrushCore發佈已經有一段日子了,相信不少人早已迫不及待地開始嘗試了,不知道你們的體驗如何?毋庸置疑的是,ZBrushCore專為剛接觸3D並希望進入3D雕刻、3D列印以及插畫世界的人而設計。 ...
  • 1.TypeScript的下載和安裝 使用npm安裝: npm install -g typescript 註意:如果沒有安裝npm,npm為nodejs管理包,則可以嘗試先安裝nodejs,nodejs中會攜帶安裝npm 2. 使用tsc編譯工具將.ts文件編譯為.js文件 ...
  • 1、表單標簽 所有需要提交到伺服器端的表單項必須使用<form></form>括起來! form 標簽屬性: action,整個表單提交的位置(可以是一個頁面,也可以是一個後臺 java 代碼) method,表單提交的方式(get/post/delete……等 7 種) Get 與 post 提交 ...
  • 1.行間樣式給單獨的標簽添加樣式.<div style="width:100px; height:100px; background-color:red;"></div>優點:比較方便可以即時的添加屬性。缺點:修改屬性非常麻煩、需要一個個去修改。 2.內聯樣式表<style>div{ <!--選擇器 ...
  • 何為Curry化/柯里化? curry化來源與數學家 Haskell Curry的名字 (編程語言 Haskell也是以他的名字命名)。 柯里化通常也稱部分求值,其含義是給函數分步傳遞參數,每次傳遞參數後部分應用參數,並返回一個更具體的函數接受剩下的參數,這中間可嵌套多層這樣的接受部分參數函數,直至 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...