js中數組常用方法的簡單重構(部分),幫助你加快理解數組中常用方法

来源:https://www.cnblogs.com/Lsw-Lawaice/archive/2020/03/29/12591165.html
-Advertisement-
Play Games

將指定數字插入到數組的末尾,返回值為 將數組的第一個元素刪除並返回,返回值為 ...


push

將指定數字插入到數組的末尾,返回值為新數組的長度

    //原方法示例:
    var ary = [1, 2, 3, 4, 5];
    ary.length = 5;
    ary.push(1) ;
    ary = [1,2,3,4,5,1];
    ary.length = 6;

   //方法重構:
Array.prototype.myPush = function () {
    for (i = 0; i < arguments.length; i++) {
        this[this.length] = arguments[i];
    }
    return this.length
}

pop

將數組最後的元素刪除,返回值為刪除掉的元素

    //原方法示例:
    var ary = [1, 2, 3, 4, 5];
    var num = ary.pop();
    console.log(num); == 5

    //方法重構:
Array.prototype.myPop = function () {
    var num = this[this.length - 1];
    this.length--
    return num
}

unshift

將指定的數字插入到元素的前面,返回值為新數組的長度

    //原方法示例:
    var ary = [1, 2, 3, 4, 5];
    ary.length = 5;
    ary.unshift(1) ;
    ary = [1,1,2,3,4,5];
    ary.length = 6;

    //方法重構:
Array.prototype.myUnshift = function () {
    var len = this.length; //用一個變數存儲原來的數組的長度
    this.length += arguments.length; //傳入進來幾個參數,數組的長度就增加傳入進來的參數的長度
    for (var i = 0; i < arguments.length; i++) {
        /* 整體需要進行幾輪的迴圈,迴圈的輪數應該與傳入進來的實參長度相等,因為第一輪的時候只是將數組整體往後面移了一個位置,想要前面能夠有足夠實參插入的長度,那麼迴圈的輪數就是由實參的長度所確定的*/
        for (var j = len; j > 0; j--) {
            /* 因為往前面插入,所以將數組的中原來的值往後移動,並且從最後一位開始移動才能使數組中的元素不被覆蓋 */
            this[j] = this[j - 1];
            /* 讓後面為空的元素等於前面的值,將數組的值依次往後移動 */
        }
        len++; /* 內部迴圈完畢後,此時的原數組的最後一位已經往後移動了一位,如果還需要將數組往後繼續進行移動的話,那麼就應該從原數組的最後一位繼續往後移動,所以此時的len就應該加一。如果不進行加一操作的話,會把後面的元素覆蓋掉,並且整個數組將不會再往後移動,後面都是空元素 */
    }
    return this.length
}

shift

將數組的第一個元素刪除並返回,返回值為被刪除的元素

    //原方法示例:
    var ary = [1, 2, 3, 4, 5];
    var num = ary.shift();
    console.log(num); === 1

    //方法重構:
Array.prototype.myShift = function () {
    var num = this[0];
    var len = this.length;
    for (var i = 0; i < len; i++) {
        this[i] = this[i + 1];
    }
    this.length--;
    return num
}

concat

將數組進行拼接,返回值是拼接後的數組(傳入的參數中有數組,並且其中存在空元素,空元素也會進行拼接)

    //原方法示例:
    var ary = [1, 2, 3, 4, 5];
    var ary1 = ary.concat([1, 2, 3, , 4], {a:1})
    console.log(ary1) === [1, 2, 3, 4, 5, 1, 2, 3, , 4, {a:1}]

    //方法重構:
Array.prototype.myConcat = function () {
    var ary = this;
    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i].constructor === Array) {
            for (var j = 0; j < arguments[i].length; j++) {
                ary[ary.length] = arguments[i][j];
            }
        } else {
            ary[ary.length] = arguments[i];
        }
    }
    return ary
}

join

將數組用傳入的參數進行拼接,返回值為拼接後的字元串(不傳入參數,預設為"")

    //原方法示例:
    var ary = [1, 2, 3, 4, 5];
    var str = ary.join();
    console.log(str) === "1,2,3,4,5"

    //方法重構:
Array.prototype.myJoin = function () {
    var str = "";
    if (arguments[0] === "" || arguments[0] === undefined) {
        for (i = 0; i < this.length - 1; i++) {
            str += this[i] + ",";
        }
    } else {
        for (i = 0; i < this.length - 1; i++) {
            str += this[i] + arguments[0];
        }
    }
    str += this[this.length - 1];
    return str
}

some

第一個傳入的參數為一個函數,該函數有三個參數,分別為item、index、ary,將該函數執行,返回執行結果,如果結果中有一個true結束運行沒有true將一直查找下去。返回值為布爾值

    //原方法示例:
    var ary = [1, 2, 3, 4, 5];
    var bool = ary.some(function(item,index,ary){
        return item > 4;
    })// true

    //方法重構:
Array.prototype.mySome = function () {
    for (var i = 0; i < this.length; i++) {
        var bool = arguments[0](this[i], i, this);
        if (bool) return true;
    }
    return false;
}

every

第一個傳入的參數為一個函數,該函數有三個參數,分別為item、index、ary,將該函數執行,返回執行結果,如果結果中有一個false結束運行沒有false將一直查找下去。返回值為布爾值

    //原方法示例
    var ary = [1, 2, 3, 4, 5];
    var bool = ary.every(function(item,index,ary){
        return item > 1;
    })// false

    //方法重構
Array.prototype.myEvery = function () {
    for (var i = 0; i < this.length; i++) {
        var bool = arguments[0](this[i], i, this);
        if (!bool) return false;
    }
    return true;
}

slice

可傳入兩個參數,第一個參數代表這起始下標位置,第二個參數選填,代表到這個數字下標前結束.

不傳參數,預設截取到末尾,參數也可為負數.

返回值截取的數組成的數組,原數組不變

    //原方法示例:
    var ary = [1, 2, 3, 4, 5];
    ary.slice() ===> [1, 2, 3, 4, 5];
    ary.slice(1,3) ===> [2, 3]
    ary.slice(-3,-1) ===> [3, 4]

    //方法重構:
Array.prototype.mySlice = function () {
    /* 
    分為兩種情況:
    1、當arguments[1]為0時,或者為undefined時,此時有以下情況:
        1、如果此時的arguments[1]是undefined時有以下情況:
            1、當arguments[0]大於等於0時,從arguments位下標開始往後截取
            2、當arguments[0]為undefined時,複製一份原數組
            3、其他情況都返回空數組
    2、當arguments[1]為true時,有以下情況:
        1、正常情況下,當arguments[0]小於等於arguments[1]時,有以下情況
            1、兩個參數都是大於0的情況下(arguments[0]可等於0),從arguments[0]位下標開始複製到arguments[1]位下標前一位結束
            2、兩個參數都小於0時,此時的開始位置(arguments[0])和結束位置(arguments[1])應該都加上數組的長度
        2、除去上面的情況,都為非正常情況,所以都返回空數組
    */
    var ary = [];
    if (arguments[1] > this.length) arguments[1] = this.length;
    //判斷傳入的第二個參數是否超出數組的長度,如果超出,則讓它預設為數組的長度
    if (!arguments[1]) {
        //當argumens為0或者不傳時
        if (typeof arguments[1] === 'undefined') {
            //判斷當argumens[1]是否為undefined,如果是,進入此語句
            if (arguments[0] >= 0) { //當argumens[0]
                for (var i = arguments[0]; i < this.length; i++) {
                    ary[ary.length] = this[i];
                }
                return ary
            } else if (typeof arguments[0] === 'undefined') {
                for (var j = 0; j < this.length; j++) {
                    ary[ary.length] = this[i];
                }
                return ary
            }
        } else return ary //除去上述情況都為非正常情況,返回空數組

    } else {
        //否則當argument[1]>0時進入此語句
        if (arguments[0] <= arguments[1]) {
            //正常情況下開始位置總會小於等於結束位置
            if (arguments[0] >= 0 && arguments[1] > 0) {
                //第一種情況:兩個都大於0時(arguments[0]可以等於0)
                for (var k = arguments[0]; k < arguments[1]; k++) {
                    //直接複製
                    ary[ary.length] = this[k];
                }
                return ary
            } else if (arguments[0] < 0 && arguments[1] < 0) {
                //第二種情況:兩個都小於0時
                for (var n = arguments[0] + this.length; n < arguments[1] + this.length; n++) {
                    //首先需要將兩個負的參數都加上數組的長度變為正
                    ary[ary.length] = this[n];
                }
                return ary
            } else return ary //除去上述情況都為非正常情況,返回空數組
        } else return ary //除去上述情況都為非正常情況,返回空數組  
    }
}

forEach

將數組中的每一項進行遍歷,不遍歷空元素無返回值

Array.prototype.myForEach = function () {
    var len = this.length-1;
    for (var item in this) {
        if (len === 0) break;
        arguments[0](this[item],item,this);
        len--;
    }
}

map

將數組中的每一項進行遍歷,返回一個與原數組長度相同的數組

    // 原方法示例:
    var ary = [1, 2, 3, 4, 5];
    ary.map(function(item,index,ary){
        return item * 2
    }) === [2,4,6,8,10]

    // 方法重構:
Array.prototype.myMap = function () {
    var ary = [];
    ary.length = this.length;
    var len = ary.length-1;
    for (var item in this) {
        if (len === 0) break;
        ary[item] = arguments[0](this[item],item.this);
        len--;
    }
    return ary
}

filter

第一個傳入的參數為一個函數,函數中可傳入三個參數,分別為item、index、ary,返回值是一個由所有滿足條件的元素所組成的數組

    //原方法示例:
    var ary = [1, 2, 3, 4, 5];
    ary.filter(function(item,index,ary){
        return item > 2
    }) === [3,4,5]

    //方法重構:
Array.prototype.myFilter = function () {
    var ary = [];
    for (var i = 0; i < this.length; i++) {
        var bool = arguments[0](this[i], i, this);
        if (bool) {
            ary[ary.length] = this[i];
        }
    }
    return ary
}

reduce

第一個傳入的參數為一個函數,函數中可傳入四個參數,分別為value、item、index、ary,返回計算後第一個參數的值,返回值為一個值

如果有傳入第二個參數,那麼第一個參數的第一個參數的預設值就為它,並且第一個參數的第二個參數從數組的第0位起始;

否則,未傳入,那麼第一個參數的第一個參數就時數組的第0位,並且第一個參數的第二個參數從數組的第1位起始

    //原方法示例:
    var ary = [1, 2, 3, 4, 5];
    var num = ary.reduce(function(value,item,index,ary){
        return value + item;
    })
    console.log(num) === 15

    //方法重構:
Array.prototype.myReduce = function () {
    var initValue;
    var i = 0;
    if (arguments[1] || arguments[1] === 0) {
        initValue = arguments[1];
    } else {
        initValue = this[0];
        i++;
    }
    while (i < this.length) {
        initValue = arguments[0](initValue, this[i], i, this);
        i++;
    }
    return initValue;
}

reduceRight

第一個傳入的參數為一個函數,函數中可傳入四個參數,分別為value、item、index、ary,返回計算後第一個參數的值,返回值為一個值

如果有傳入第二個參數,那麼第一個參數的第一個參數的預設值就為它,並且第一個參數的第二個參數從數組的第length-1位起始;

否則,未傳入,那麼第一個參數的第一個參數就時數組的第length-1位,並且第一個參數的第二個參數從數組的第length-2位起始

    //原方法示例:
    var ary = [1, 2, 3, 4, 5];
    var num = ary.reduceRight(function(value,item,index,ary){
        return value + item;
    })
    console.log(num) === 15

    //方法重構:
Array.prototype.myReduceRight = function () {
    var initValue;
    var i = this.length - 1;
    if (arguments[1] || arguments[1] === 0) {
        initValue = arguments[1];
    } else {
        initValue = this[this.length - 1];
        i--;
    }
    while (i >= 0) {
        initValue = arguments[0](initValue, this[i], i, this);
        i--
    }
    return initValue
}

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

-Advertisement-
Play Games
更多相關文章
  • 直播平臺大致流程 實時傳輸協議有:RTMP、HLS、HDL(HTTP-FLV) 編譯環境 apt-get install build-essential nginx安裝 安裝pcre(目前最新8.44) ./configure make && make install pcre-config --v ...
  • 報錯詳盡信息 Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported. 關鍵詞 前言 最近在做一個創意類的圖片合成工具,大概齊就 ...
  • 問題來源 上回書說到,Layui 在提交表單時對 進行驗證,這次依舊是 ,跟它杠上了。 在網頁中有很多時候會用到表單賦初值,Layui 給我們提供了非常便利的方法: ,但是,這個方法是有一定局限的,例如在使用這個方法給 賦初值時就沒有成功(至少我沒有),但是我又需要用到,Google 也沒找到覺得合 ...
  • 前言 TypeScript是微軟開發的一門自由和開源的編程語言,TypeScript是JavaScript的一個超集,他保留JavaScript語言本身的特性,同時他向我們提供了一些語法糖幫助我們方便更好的實踐面向對象編程。 同時利用他我們可以使JavaScript開發變得更簡單,同時他更符合前端模 ...
  • number類型函數 random() 0-1 random(10) 0-10之間的整數 random(100) 0-100之間的整數 編譯後 list數組相關函數 編譯後 @debug 實時返回列印結果,併在控制台輸出 如現在演示的函數操作,沒有實際的css意義,可以直接在控制台輸出 輸出結果 字 ...
  • 盒模型分為標準盒模型和怪異盒模型,他們的區別在於計算內容區的不同。 我們來看input標簽 這是一個高度相同,邊框相同的搜索框和一個提交按鈕。給他們寫長、相同的高和一個1px的邊框。 看 他們在網頁中顯示的高度現在看起來是不一樣的。不止高度不一樣提交按鈕的長度現在也不是和我定的數值一樣。這個提交按鈕 ...
  • 1 <div style="width: 50%"> 2 <table class="layui-table"> 3 <tbody> 4 <tr> 5 <td>Bud</td> 6 <td>179</td> 7 <td>183</td> 8 <td>44</td> 9 <td>37</td> 10 ...
  • 1、ThymeLeaf+LayUI表格渲染錯誤 使用thymeleafhe+layui渲染表格時,出現錯誤org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: 這是因為[[]]是thy ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...