JavaScript語法基礎:數組的常用方法詳解

来源:https://www.cnblogs.com/smyhvae/archive/2018/01/26/8359654.html
-Advertisement-
Play Games

本文最初發表於 "博客園" ,併在 "GitHub" 上持續更新 前端的系列文章 。歡迎在GitHub上關註我,一起入門和進階前端。 以下是正文。 數組的定義 之前學習的數據類型,只能存儲一個值(字元串為一個值)。如果我們想存儲多個值,就可以使用數組。 數組的定義 (1)字面量定義。舉例: (2)對 ...


本文最初發表於博客園,併在GitHub上持續更新前端的系列文章。歡迎在GitHub上關註我,一起入門和進階前端。

以下是正文。

數組的定義

之前學習的數據類型,只能存儲一個值(字元串為一個值)。如果我們想存儲多個值,就可以使用數組。

數組的定義

(1)字面量定義。舉例:

var arr = [1,2,3];

(2)對象定義(數組的構造函數)。格式:

var arr = new Array(參數);

參數位置是一個數值時,表示數組長度;多個數值時,表示數組中的元素。

數組的操作

1、求數組的長度:

    數組的長度 = 數組名.length;

可以通過修改數組的長度來改變數組中元素的個數,如果改小了,數組將從後面刪除元素。(偽數組arguments的長度可以修改,但是不能修改裡面的元素,後面單獨講)

2、獲取數組中的元素:

    數組中的指定元素 = 數組名[索引值];

數組的索引代表的是數組中的元素在數組中的位置,從0開始。

如果索引值有誤(比如元素沒那麼多),系統不報錯,而是會給定值為undefined。

遍曆數組(重要)

遍曆數組即:獲取並操作數組中的每一個元素。

舉例:

        var arr = ["生命壹號","許嵩","永不止步"];
        for(var i = 0;i<arr.length;i++){
            console.log(arr[i]);  // arr[i]代表的是數組中的每一個元素i
        }

        console.log(arr);

列印結果:

數組Array的常用方法

Array數組是屬於內置對象,我們可以在下麵的網站上查詢各種方法。

Array有各種api介面(Application Programming Interface,應用程式編程介面),下麵分別介紹。

(1)判斷是否為數組:instanceof

    布爾類型值 = A instanceof B;

解釋:判斷A是否為B類型(instanceof 是一個關鍵字)。

在數組裡,這種方法已經用的不多了,因為有下麵這種方法。

(2)判斷是否為數組:isArray()

    布爾類型值 = Array.isArray(被檢測的值) ;

PS:屬於HTML5中新增的方法。

(3)轉換數組:toString()

    字元串 = 數組.toString();

解釋:把數組轉換成字元串,每一項用,分割。

(4)返回數組本身:valueOf()

    數組本身 = 數組.valueOf();

這個方法的意義不大。因為我們指直接寫數組對象的名字,就已經是數組本身了。

(5)將數組中的元素用符號連接成字元串:join()

    字元串 = 數組.join(參數);

參數決定用什麼符號進行連接。如果不寫參數,則和toString()的效果一致。

舉例:

    var arr = ["生命壹號","許嵩","棒棒噠"];

    console.log(arr.join());    //無參數
    console.log(arr.join(" ")); //用空格進行連接
    console.log(arr.join(""));  //用空字元串進行連接
    console.log(arr.join("&")); //用符號"&"進行連接

列印結果:

    生命壹號,許嵩,棒棒噠

    生命壹號 許嵩 棒棒噠

    生命壹號許嵩棒棒噠

    生命壹號&許嵩&棒棒噠

join方法有一定的實際用途:當我們需要把一堆字元串進行連接時,我們可以把他們轉換成數組,然後調用數組的join()方法。這樣做有個好處是:記憶體不會溢出。

偽數組:arguments

arguments代表的是實參。有個講究的地方是:arguments只在函數中使用

(1)返回函數實參的個數:arguments.length

舉例:

    fn(2,4);
    fn(2,4,6);
    fn(2,4,6,8);

    function fn(a,b) {
        console.log(arguments);
        console.log(fn.length);         //獲取形參的個數
        console.log(arguments.length);  //獲取實參的個數

        console.log("----------------");
    }

列印結果:

(2)返回正在執行的函數:arguments.callee

在使用函數遞歸調用時,推薦使用arguments.callee代替函數名本身。

(3)之所以說arguments是偽數組,是因為:arguments可以修改元素,但不能改變數組的長短。舉例:

    fn(2,4);
    fn(2,4,6);
    fn(2,4,6,8);

    function fn(a,b) {
        arguments[0] = 99;  //將實參的第一個數改為99
        arguments.push(8);  //此方法不通過,因為無法增加元素
    }

數組的添加和刪除

(1)push():在數組最後面插入項,返回數組的長度

    數組改後的長度 = 數組.push(元素);

(2)pop():取出數組中的最後一個元素,返回被刪除的元素

    被刪除的元素 = 數組.pop();

(3)unshift():在數組最前面插入項,返回數組的長度

數組改後的長度 = 數組.unshift(元素);

(4)shift():取出數組中的第一個元素,返回被刪除的元素

    被刪除的元素 = 數組.shift();

數組的反轉和排序

(1)reverse():翻轉數組(返回值是反轉後的數組,而且原數組也已經被反轉了

    反轉後的數組  =  數組.reverse();

舉例:

    var arr = ["a","b","c","d","e","f"];

    console.log(arr);              //反轉前列印
    console.log(arr.reverse());    //反轉
    console.log(arr);              //反轉後列印

列印結果:

註意:反轉後,列印原來的數組發現,原來的數組已經被反轉了。

(2)sort():給數組排序,返回排序後的數組(排序的規則看參數)

    從小到大排序後的數組 = 數組.sort(function(a,b){
                                      return a-b;
    });
  • 無參:按照數組元素的首字元對應的Unicode編碼值,從小到大排列數組元素。

  • 帶參:必須為函數(回調函數:callback)。這個回調函數中帶有兩個參數,代表數組中的前後元素。
    • 如果返回值(a-b)為負數,a排b前面。
    • 如果返回值(a-b)等於0,不動。
    • 如果返回值(a-b)為正數,a排b後面。

上面的這個帶參的排序,其實是調用了底層的冒泡排序,小的排前面,大的排後面。

PS:sort方法的功能非常強大,能對數字和字母進行排列。

數組的一些其他方法

(1)concat() :把參數拼接到當前數組(原數組不會被修改)

    新數組 = 數組1.concat(數組2);

舉例:

    var arr1 = [1,2,3];
    var arr2 = ["a","b","c","d","e","f"];

    console.log(arr1.concat(arr2));  //把參數拼接到當前數組
    console.log(arr1);
    console.log(arr2);

列印結果:

從列印結果中可以看到,原數組(數組1、數組2)並沒有被修改。

(2)slice():從當前數組中截取一個新的數組(不影響原來的數組)

    新數組 = 原數組.slice(開始位置index,結束位置index);    //註意:索引值包括左邊的,不包括右邊的

舉例:

    var arr = ["a","b","c","d","e","f"];

    console.log(arr.slice(2));  //從第二個值開始截取
    console.log(arr.slice(2,4));  //截取從第二個到第四個之間的值(不包括第四個值)
    console.log(arr.slice(-2)); //截取最後兩個值
    console.log(arr.slice(4,2));  //空

列印結果:

(3)splice():刪除當前數組的某些元素(原數組會被改變)

    新數組 = 數組1.splice(起始索引index,需要操作的個數,彌補的值);

舉例:

    var arr11 = ["a","b","c","d","e","f"];
    var arr12 = arr11.splice(1);    //從第一個位置開始,刪除元素
    console.log("原數組:"+arr11);
    console.log("新數組:"+arr12);
    console.log("-----------");

    var arr21 = ["a","b","c","d","e","f"];
    var arr22 = arr21.splice(1,3);    //從第一個元素開始刪除,一共刪除3個元素
    console.log(arr21);
    console.log(arr22);

列印結果:

PS:第三個參數很少用,這裡先不講。

(3)獲取數據的索引:indexOf()、lastIndexOf()

  • indexOf():從前往後索引

  • lastIndexOf() :從後往前索引

    索引值 = 數組.indexOf/lastIndexOf(數組中的元素內容);

PS:如果沒找到返回-1。

舉例:

    var arr = ["a","b","c","d","e","d","c"];

    console.log(arr.indexOf("c"));       //從前往後,找"c"在哪個位置
    console.log(arr.lastIndexOf("d"));   //從前往後,找"d"在哪個位置

列印結果:

數組迭代方法

數組迭代方法包括:every()、filter()、forEach()、map()、some()

PS:這幾個方法不會修改原數組

語法格式:

數組/boolean/無 = 數組.every/filter/forEach/map/some(
                            function(element,index,arr){
                                            程式和返回值;

有了這幾種方法,就可以替代一些for迴圈了。下麵依次來介紹。

every()方法

解釋:對數組中每一項運行回調函數,如果都返回true,every就返回true;如果有一項返回false,則停止遍歷,此方法返回false。

註意:every()方法的返回值是boolean值,參數是回調函數。

舉例:

    var arr1 = ["千古", "宿敵", "南山憶", "素顏"];
    var bool1 = arr1.every(function (element, index, array) {
        if (element.length > 2) {
            return false;
        }
        return true;
    });
    console.log(bool1);  //輸出結果:false。只要有一個元素的長度是超過兩個字元的,就返回false

    var arr2 = ["千古", "宿敵", "南山", "素顏"];
    var bool2 = arr2.every(function (element, index, array) {
        if (element.length > 2) {
            return false;
        }
        return true;
    });
    console.log(bool2);  //輸出結果:true。因為每個元素的長度都是兩個字元。

some()方法

解釋:對數組中每一項運行回調函數,只要有一項返回true,則停止遍歷,此方法返回true。

filter()方法

解釋:對數組中每一項運行回調函數,該函數返回結果是true的項,將組成新的數組(返回值就是這個新的數組)。

    var arr1 = ["千古", "宿敵", "南山憶", "素顏"];

    var arr2 = arr1.filter(function (element, index, array) {
        if (element.length > 2) { //arr1中的元素,如果是長度超過2個字元的,我就把它放到arr2中去
            return true;
        }
        return false;
    });
    console.log(arr1);
    console.log(arr2);

結果:

forEach()方法

解釋:遍曆數組。

註意:無返回值,純粹操作數組中的元素,所以應用場景並不多。

map()方法

解釋:對數組中每一項運行回調函數,返回該函數的結果,組成的新數組(返回值就是這個新的數組)。

舉例:

    var arr1 = ["千古", "宿敵", "南山憶", "素顏"];

    var arr2 = arr1.map(function (element, index, array) {
        return element + "vae";  //給arr1中所有的元素增加字元串"vae",放到arr2中。
    });

    console.log(arr1);
    console.log(arr2);

結果:

清空數組

清空數組,有以下幾種方式:

    var array = [1,2,3,4,5,6];

    array.splice(0);      //方式1:刪除數組中所有項目
    array.length = 0;     //方式1:length屬性可以賦值,在其它語言中length是只讀
    array = [];           //方式3:推薦

數組練習

練習1

問題:將一個字元串數組輸出為|分割的形式,比如“千古|宿敵|素顏”。使用兩種方式實現。

答案:

方式1:(不推薦)

    var arr = ["千古","宿敵","素顏"];
    var str = arr[0];
    var separator = "|";
    for(var i = 1;i< arr.length;i++) {
        str += separator+arr[i];    //從第1個數組元素開始,每個元素前面加上符號"|"
    }

    console.log(str);

輸出結果:

不推薦這種方式,因為:由於字元串的不變性,str拼接過多的話,容易導致記憶體溢出(很多個str都堆放在棧里)。

方式2:(推薦。通過array數組自帶的api來實現)

    var arr = ["千古","宿敵","素顏"];

    console.log(arr.join("|"));

結果:

練習2

題目:將一個字元串數組的元素的順序進行反轉,使用兩種種方式實現。提示:第i個和第length-i-1個進行交換。

答案:

方式1:

   function reverse(array) {
       var newArr = [];
       for (var i = array.length - 1; i >= 0; i--) {
           newArr[newArr.length] = array[i];
       }
       return newArr;
   }

方式2:(演算法里比較常見的方式)

   function reverse(array){
       for(var i=0;i<array.length/2;i++){
           var temp = array[i];
           array[i] = array[array.length-1-i];
           array[array.length-1-i] = temp;
       }
       return array;
   }

方式3:(數組自帶的reverse方法)

現在我們學習了數組自帶的api,我們就可以直接使用reverse()方法。

練習3

問題:針對工資的數組[1500,1200,2000,2100,1800],把工資超過2000的刪除。

答案:

    var arr1 = [1500, 1200, 2000, 2100, 1800];

    var arr2 = arr1.filter(function (ele, index, array) {
        if (ele < 2000) {
            return true;
        }
        return false;
    })
    console.log(arr1);
    console.log(arr2);

結果:

練習4

問題:編寫一個方法去掉一個數組中的重覆元素。

分析:創建一個新數組,迴圈遍歷,只要新數組中有老數組的值,就不用再添加了。

答案:

//    編寫一個方法 去掉一個數組的重覆元素
    var arr = [1,2,3,4,5,2,3,4];
    console.log(arr);
    var aaa = fn(arr);
    console.log(aaa);
    //思路:創建一個新數組,迴圈遍歷,只要新數組中有老數組的值,就不用再添加了。
    function fn(array){
        var newArr = [];
        for(var i=0;i<array.length;i++){
            //開閉原則
            var bool = true;
            //每次都要判斷新數組中是否有舊數組中的值。
            for(var j=0;j<newArr.length;j++){
                if(array[i] === newArr[j]){
                    bool = false;
                }
            }
            if(bool){
                newArr[newArr.length] = array[i];
            }
        }
        return newArr;
    }

我的公眾號

想學習代碼之外的軟技能?不妨關註我的微信公眾號:生命團隊(id:vitateam)。

掃一掃,你將發現另一個全新的世界,而這將是一場美麗的意外:


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

-Advertisement-
Play Games
更多相關文章
  • 當ngModel雙向綁定非基本數據類型值時 子組件中ngModel綁定的值改變時,通過onChangeCallback 傳回父組件時,有兩種情況: 1. 基本數據類型:string/number 等變數,父組件中會跟著變化 1. 非基本數據類型:{}/[]/Date/... 父組件中不會檢測到變化 ...
  • 在實際應用中,我們經常會遇到本文換行和文本溢出時截取字元串的情況,在理解文本溢出屬性之前,我們首先要瞭解文本換行和空白符這兩個屬性,然後再學習文本溢出text-overflow屬性。 white-space屬性:用來對空格進行處理。 可能的屬性值有: (2)pre:使用pre屬性值的時候,空白和換行 ...
  • 流程圖如下: 重回DescriptionFilePlugin 上一節最後進入relative事件流,註入地點如下: 這似曾相識的感覺,這不就是解析package.json的插件麽,又調用了一次。 但是有一點點微妙的不同,第一次調用該插件時,request對象如下所示: 在經過幾個插件的洗禮後,變成了 ...
  • Array.isArray() 用來檢驗是不是數組 可以看出 typeof 並不能檢驗數組,雖然 Array.isArray() 可以檢驗數組,但是 IE8 都不相容 這個方法可以相容IE8 以及以下的瀏覽器 typeof 這裡 null 是基本類型,不是一個對象,這個是 JS 的一個 bug。還有 ...
  • 今天在整理前段時間做過的項目,發現之前在集成web環信的時候遇到過一個奇怪的需求:需要終止一個正在進行等待返回的promise,或者阻止其調用resolve和reject。(具體為何會有這種需求我也不太記得了。。。 現在回頭看,一定會有其他的常規解決方案)。 不過本著對未知牛角尖的專研精神(最近有點 ...
  • mui傳值,使用mui.openWindow()實現,參數extras傳入參數,被傳入的頁面用plus接收即可 ...
  • function num(obj){ obj.value = obj.value.replace(/[^\d.]/g,""); //清除"數字"和"."以外的字元 obj.value = obj.value.replace(/^\./g,""); //驗證第一個字元是數字 obj.value = o ...
  • 數組方法是否為數組Array.isArray(param)如果param是 Array,則為true; 否則為false。數組轉字元串joinjoin(separator)以separator為分隔符,省略的話則用預設用逗號為分隔符可以實現重覆字元串,實質是在n+1個空字元串之間加入要重覆 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...