JavaScript Array數組方法詳解

来源:http://www.cnblogs.com/neusc/archive/2016/08/16/5774458.html
-Advertisement-
Play Games

Array類型是ECMAScript中最常用的引用類型。ECMAScript中的數據與其它大多數語言中的數組有著相當大的區別。雖然ECMAScript中的數據與其它語言中的數組一樣都是數據的有序列表,但不同的是,ECMAScript數組中的每一項可以保存任何類型的數據,無論是數值、字元串或者是對象。 ...


  Array類型是ECMAScript中最常用的引用類型。ECMAScript中的數據與其它大多數語言中的數組有著相當大的區別。雖然ECMAScript中的數據與其它語言中的數組一樣都是數據的有序列表,但不同的是,ECMAScript數組中的每一項可以保存任何類型的數據,無論是數值、字元串或者是對象。同時,ECMAScript中的數組大小是可以動態調整的,即可以根據數據的添加自動增長以容納新增的數據。下麵總結一下JavaScript中數組常用的操作函數及用法。

  • 創建數組

  創建數組主要有構造函數和數組字面量兩種方法,如下所示:

var arr = new Array();
var arr = [];

  對於構造函數,我們可以傳遞一個數值創建包含給定項數的數組,如下:

var arr = new Array(3);    //數組長度為3

  也可以直接傳遞存放於數組中的值,如下:

var arr = new Array("red","green","blue");

  不論哪種方式,推薦使用數組字面量的形式來創建數組。

  • 檢測數組

  對於單一的全局執行環境而言,使用instanceof操作符就可以檢測是否為數組,例如:

var arr = [1,2,3];
console.log(arr instanceof Array);   //true

  但如果網頁中包含多個框架,也就包含多個全局執行環境,ES5新增了Array.isArray()方法來確定某個值是否為數組,而不管它是在哪個全局執行環境中被創建的,如下:

if(Array.isArray(arr)){
       //執行某些操作
}
  • 數組字元串轉換

  每個對象都具有toLocaleString()、toString()和valueof()方法。調用數組的toString()方法會返回數組中每個值的字元串形式拼接而成並且以逗號分隔的字元串,調用數組的valueof()方法返回的還是數組,實際上調用的是數組每一項的toString()方法,如下:

var arr = ["red","green","blue"];
console.log(arr.toString());   //red,green,blue
console.log(arr.valueof());    //red,green,blue
console.log(arr);              //red,green,blue

  而調用數組的toLocaleString()方法,與toString()不同的是它會調用數組每一項的toLocaleString()方法,將每一項toLocaleString()方法的返回值以逗號分隔拼接成一個字元串。而使用join()方法,可以使用不同的分隔符來構建這個字元串,如下:

var arr = ["red","green","blue"];
console.log(arr.join(","));   //red,green,blue
console.log(arr.join("||"));   //red||green||blue
  • 數組的添加和刪除

  push()方法接收任意數量的參數,把它們逐個添加到數組末尾,並返回修改修改後數組的長度,例如:

var arr = [1,2,3];
arr.push(4,5);
console.log(arr);   //[1,2,3,4,5]

  與push()相對的是pop()方法,它從數組末尾移除最後一項,並返回移除的項,例如:

var arr = [1,2,3];
arr.pop();   //3
arr.pop();   //2
console.log(arr);   //[1]

  另外兩個使用的方法是shift()和unshift(),它們與pop()和push()類似,shift()方法用於從數組的起始位置移除項並返回移除項,例如:

var arr = [1,2,3];
arr.shift();   //1
arr.shift();   //2
console.log(arr);   //[3]

  unshift()方法與shift()用途相反,它能夠在數組前端添加任意個項並返回新數組的長度,例如:

var arr = [1,2,3];
arr.unshift(4);   //返回長度4
arr.unshift(5);   //返回長度5
console.log(arr);   //[1,2,3,4,5]
  • 數組的翻轉與排序

  數組提供的翻轉方法為reverse(),它會反轉數據項的順序,例如:

var arr = [1,2,3];
arr.reverse();
console.log(arr);   //[3,2,1]

  sort()也可以對數組進行排序,不過它的預設排序方式並不是大小,而是根據對應字元串逐個編碼排序的。sort()方法可以接收一個比較函數,進行自定義排序,例如:

function compare(value1,value2){
   return value1-value2;
}
var arr = [1,3,2,5,4];
arr.sort(compare);
console.log(arr);   //[1,2,3,4,5]
  • 數組連接

  concat()方法會創建當前數組的一個副本,然後將接收到的參數添加到這個副本的末尾,最後返回新構建的數組,原來的數組不變,例如:

var arr = [1,2,3];
var arr2 = arr.concat(4,[5,6]);
console.log(arr);   //[1,2,3]
console.log(arr2);   //[1,2,3,4,5,6]
  • 數組分割

  slice()方法接收一個或兩個參數,即要返回項的開始位置和結束位置。如果只要一個參數,則返回從指定位置開始到數組結束的所有項。如果接收兩個參數,則返回起始和結束位置之間的所有項但不包括結束位置的項,例如:

var arr = [1,2,3,4,5];
var arr2 = arr.slice(1);   //[2,3,4,5]
var arr3 = arr.slice(1,3);   //[2,3]

  註意,slice()方法不會影響原來的數組。

  • splice()方法

  由於splice()方法非常強大,因此單獨拿出來總結一下,它可以接收三個參數,第一個參數表示添加或刪除項目的位置,第二個參數表示要刪除的項目數量,第二個參數表示向數組中添加的新項目(可選),通過提供不同的參數可以實現刪除、插入和替換等功能,例如:

var arr = [1,2,3,4,5];
arr.splice(2,0,11,22);   //從位置2插入兩項,沒有刪除
console.log(arr);   //[1,2,11,22,3,4,5]

arr.splice(2,2,33,44);   //從位置2開始刪除兩項,插入兩項,返回被刪除的項
console.log(arr);   //[1,2,33,44,4,5]

arr.splice(1,1);   //從位置1開始刪除1項,返回被刪除的項
console.log(arr);   //[1,33,44,4,5]
  • 數組的位置方法

  ES5提供了兩個位置方法:indexOf()和lastIndexOf()。這兩個方法都接收兩個參數:要查找的項和表示查找起點位置的索引(可選)。indexOf()方法從數組的開頭向後查找,lastIndexOf()則從數組的末尾向前查找,例如:

var arr = [1,2,3,4,5,4,3,2,1];
console.log(arr.indexOf(4));   //3
console.log(arr.lastIndexOf(4));   //5

console.log(arr.indexOf(4,4));   //5
console.log(arr.lastIndexOf(4,4));   //3
  • 數組的迭代方法

  ES5定義了5種迭代方法,每個方法都接收兩個參數:要在每一項上運行的函數和(可選)運行該函數的作用域對象--影響this的值。傳入這些方法的函數可以接收三個參數:數組項的值、該項在數組中的索引和數組對象本身。

  其中,every()方法和some()方法是相似的。對於every()方法來說,傳入的函數必須對每一項都返回true,這個方法才返回true。而對於some(),傳入的函數只要對數組中的任意一項返回true,該方法就返回true。例子如下:

var arr = [1,2,3,4,5,4,3,2,1];
var everyResult = arr.every(function(item,index,array){
    return (item>2);
});
console.log(everyResult);   //false,並不是全部大於2

var someResult= arr.some(function(item,index,array){
    return (item>2);
});
console.log(someResult);   //true,某一項大於2即可

  filter()方法根據給定的函數確定是否在返回的數組中包含某一項,例如:

var arr = [1,2,3,4,5,4,3,2,1];
var filterResult = arr.filter(function(item,index,array){
    return (item>2);
});
console.log(filterResult);   //[3,4,5,4,3],返回所有數值都大於2的一個數組

  map()方法對於數組中的每一項都會運行給定的函數,然後將每一項函數運行結果組成的數組返回,例如:

var arr = [1,2,3,4,5,4,3,2,1];
var mapResult = arr.map(function(item,index,array){
    return item*2;
});
console.log(mapResult);   //[2,4,6,8,10,8,6,4,2],原先數組每一項乘以2後返回

  最後一個方法是forEach(),它只對數組中的每一項運行給定函數,沒有返回值,例如:

var arr = [1,2,3,4,5,4,3,2,1];
arr.forEach(function(item,index,array){
    //執行某些操作
});
  • 數組的縮小方法

  ES5還提供了兩個縮小數組的方法:reduce()和reduceRight()。這兩個方法都會迭代數組中的所有項,然後返回一個最終的值。reduce()從第一項開始逐漸遍歷到最後一項,reduceRight()從最後一項開始遍歷到第一項結束。這兩個函數都接收四個參數:前一個值、當前值、項的索引和數組對象。這個函數返回的任何值都會作為第一個參數自動傳遞給下一項。例如,使用reduce()方法求數組所有項的和:

var arr = [1,2,3,4,5];
var sum = arr.reduce(function(pre,cur,index,array){
    return pre+cur;
});
console.log(sum);   //15

  第一次執行回調函數,pre是1,cur是2。第二次,pre是3(1+2),cur是3。這個過程會把數組的每一項都訪問一遍,最後返回結果。reduceRight()方法與reduce()類似,只不過方向相反而已。

  這篇筆記主要是根據JavaScript高級程式設計和網上資源總結出來的,如果有不完善的地方還請指出。


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

-Advertisement-
Play Games
更多相關文章
  • 一.延遲載入的概念 當Hibernate從資料庫中載入某個對象時,不載入關聯的對象,而只是生成了代理對象,獲取使用session中的load的方法(在沒有改變lazy屬性為false的情況下)獲取到的也是代理對象,所以在上面這幾種場景下就是延遲載入。 二.理解立即載入的概念 當Hibernate從數 ...
  • 問:有了springMVC,為什麼還要用servlet?有了servlet3的註解,為什麼還要使用ServletRegistrationBean註入的方式? 使用場景:在有些場景下,比如我們要使用hystrix-dashboard,這時候就需要註入HystrixMetricsStreamServle ...
  • 本節剖析Java API中的日期和時間相關類,電腦內部是如何表示時間的?Date類的含義是什麼?Calendar完成了什麼功能,能進行哪些操作?內部是如何實現的?體現了怎樣的設計模式?Date與字元串如何相互轉換?這些類有什麼不足?... ...
  • 一、MVVM模式介紹: 在網上看過很多的MVVM中各塊的介紹,感覺很混亂。找到如下的描述感覺很合理,也很好理解(https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx)。 二、模式分析 在項目中使用這個模型,感覺有2點需要 ...
  • 作為初學者在這裡實不宜談博客,只想把自己學到的想到的總結一下,以便自己回顧知識,如能被大神無意撇到我的文章,能夠對於不足進行指導更是幸運,若給現在針對本個問題還處於迷茫的朋友帶來一絲借鑒也是開心! 盲人點燈,多多指點 ...
  • toggleClass 用來給匹配元素切換類 語法 "參考 http://www.w3schools.com/jquery/html_toggleclass.asp " 但是個人感覺應該是這樣的: 同時指定了classname和function 只有classname生效 參數說明 Paramete ...
  • 在Web項目的開發中,js,css文件會隨著項目的開發變得越來越多,越來越大,這就給給性能方面帶來一些問題,如,頁面引入的的js,css越多的話,那麼對就增加了http請求數,解決該問題的一個好的方法就是合併js,css文件. ...
  • 自己對canvas,但又有一顆做游戲的心TT。然後記錄一下對canvas的學習吧,用一個按方向鍵控制的小圓點來做練習。(編程時用了一些es6的語法) 示例的html很簡單,只有一個canvas元素: 這裡可以看到我在canvas標簽里直接定義了寬和高,這和在css裡面定義是不同的,canvas元素其 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...