js數組定義和方法 (包含ES5新增數組方法)


數組Array

1. 數組定義

一系列數據的集合成為數組。數組的元素可以為任何類型的數據(包括數組,函數等),每個元素之間用逗號隔開,數組格式:[1,2,3]。

2. 數組創建方式

(1) 字面量方法 

var arr = [1,2,3];

(2) 使用構造函數創建

 var arr = new Array(); //創建一個空數組[]  var arr = new Array(3); //創建一個長度為3的數組(數組項都為undefined)  var arr = new Array('小鳴',18,'男' ); //創建數組並寫入數組元素 ['小鳴',18,'男']

3. 數組操作

(1) 數組元素的查詢、寫入、修改

  通過索引(下標)進行查詢、寫入和修改操作,索引值從0開始;

  ①查詢:

  

  ②寫入

  

  ③修改
  

(2) 數組長度 length

  length:表示數組的長度,返回數值。

  

        length屬性不是只讀的,可以通過設置該屬性,可以從數組的末尾移除項或添加項。

  

(3) 數組遍歷 (for循環)

 

格式:for(變量初始化;判斷條件;變量更新){執行語句}

var arr = ['嘻嘻','哈哈','呵呵'];

for(var i=0;i<arr.length;i++){

    console.log(arr[i]); // 分別輸出'嘻嘻','哈哈','呵呵'

}

(4) 多維數組(數組包含數組)

var arr = [1,2,'哈哈',[3,4,'嘻嘻'],[5,6,'喲喲']];

arr[3][2]; //=>'嘻嘻'

 

4. 組方法增,刪,倒序,替換

  • push: 往數組尾部添加一個或多個元素,返回數組新的長度

     

  • pop:刪除數組最后一個元素,返回刪除的元素
  • unshift:往數組開頭添加一個或多個元素,返回數組新的長度
  • shift:刪除數組第一個元素,返回刪除的元素
  • sort:將數組中的元素排序,並返回排序后的數組,默認以字符串的排列方式(轉換成ASCII碼進行對比)
  • reverse:將數組中的元素顛倒順序,返回逆序后的數組
  • slice(start[,end])返回數組的片段或子數組,從start開始到end(不包括end所對應的元素),支持負數(負數為從后往前數), 且不會影響原數組。

   (如果省略end參數,則截取到數組的最后一項)

   

  • splice(start,deleteNum,…items):在數組中插入、刪除、替換的通用方法,返回刪除的元素。
    • start:起始索引位置
    • deleteNum:要刪除的數量
    • items:插入的元素(可以是多個)

        1.刪除 splice(start,deleteNum),返回刪除的元素

      

     2.插入 splice(start,deleteNum,...items),返回刪除的元素

      

     3.替換 splice(start,deleteNum,...items),返回刪除的元素

       

  • join(separator) 返回字符串值,其中包含了連接到一起的數組的所有元素
    • separator:分隔符,默認為逗號
  • concat() 返回一個新數組,這個新數組是由調用這個方法的數組和參數組成,參數可以是多個  

     

  如果傳遞給 concat()方法的是一或多個數組,則該方法會將這些數組中的每一項都添加到結果數組中。

  如果傳遞的值不是數組,這些值就會被簡單地添加到結果數組的末尾

  

  例題:多維數組轉化成扁平化數組。[1,[2,[[3,4],5],6]]  ==> [1,2,3,4,5,6]

  

  

5. 類型與引用類型的區別

  [內存中的狀態]

  簡單的了解:

 

  (1) 基本數據類型:存在棧內存里,復制的是值,原數據改變不會影響copy值,反之亦然。

 

  (2) 引用數據類型:存在堆內存里,復制的是引用(類似快捷方式)。原數據改變,會改變 copy值,反之亦然。

 

6. 組復制與傳輸

  • 復制數組 ( 數組是引用數據類型 )

     ① 創建空數組,遍歷數組逐個寫入;

     ② arr.slice(0)復制原數組,當元素改變不會影響原數組。

  • 把數組作為函數的參數傳遞:基本數據類型傳遞值,引用數據類型傳遞引用(快捷方式)。

     

7. 組排序

  • 冒泡排序法:當前元素與下一元素相比,把最大的逐個往后排列,實現從小到大排列。(如果 當前元素比下一元素大,利用第3個變量暫時儲存大值)

     

  • 選擇排序法:當前元素分別跟后面的元素對比,把最小的逐個往前排列,實現從小到大排列。

     

  • 快速排序法:

    大致分三步:

    1找基准(一般是以中間項為基准)

    2遍歷數組,小於基准的放在left,大於基准的放在right

    3遞歸

  • Sort排序:默認字符串排序(ascii碼),轉換成數字排序:往sort中傳入一個函數作為 參數。從小到大或從大到小排序。(sort排序后,舊數組也會變成相應的順序。)

          -------->     

    eg: 一個對象數組,根據數組中的對象的某個屬性值進行排序。sort方法的函數參數中返回另一個函數

var dataArr = [{name:'xxx',age:12},{name:'yyy',age:32},{name:'zzz',age:25},{name:'aaa',age:6}];
function compareObj(proName){
    return function(a,b){
        console.log(a,b)
        var x = a[proName];
        var y = b[proName];
        return x-y;
    }
 }
 dataArr.sort(compareObj('age'));//根據數組中的對象的age屬性排序。
 console.log(dataArr);// 打印值見下圖

8. ES5新增數組方法(IE9+支持)

(1) 靜態方法

Array.isArray();

判斷是否為數組,返回布爾值。( typeof()無法區分數組和對象,此方法可以 )

(2) 索引方法:

判斷數組中是否存在某個值;

① indexOf():返回要查找數值在數組中的索引值,找不到返回-1

② lastIndexOf():從后面往前找,但索引值不變。

③ indexOf / lastIndexOf(keyword[,startIndex])    【支持它們的瀏覽器包括 IE9+、Firefox 2+、Safari 3+、Opera 9.5+和 Chrome。】  

       Keyword:要查找的項,

  StartIndex:查找起點索引,為可選參數,默認為1

   

(3) 數組迭代方法(IE9+、Firefox 2+、Safari 3+、Opera 9.5+和 Chrome) 

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

① forEach(fn):用於替代for循環,比for循環簡便,但不能隨意退出,不能使用break。此方法沒有返回值。

   

② map(fn):返回的是一個數量相等的新數組,返回的內容是什么取決於在fn中返回的值。

       適用於數組中的對象,不會改變原數組。

③ filter(fn): 得到執行fn后返回時true對應的數組元素組成的數組,

       利用這個方法對數組元素進行篩選。

   

④ some(fn):如果該函數對任何一項返回ture,則返回ture

       -->用於判斷數組是否存在某個屬性值/對象等(indexOf有局限性)

       

⑤ every(fn):執行函數時,所以都返回ture,則返回ture

       

(4) 數組歸並方法(IE9+、Firefox 3+、Safari 4+、Opera 10.5 和 Chrome)

  reduce()和 reduceRight(),這兩個方法都會迭代數組的所有項,然后構建一個最終返回的值。
  其中,reduce()方法從數組的第一項開始,逐個遍歷到最后。而 reduceRight()則相反。
  這兩個方法都接收兩個參數:一個在每一項上調用的函數和(可選的)作為歸並基礎的初始值。

  給 reduce()和 reduceRight()的函數接收 4 個參數:前一個值、當前值、項的索引和數組對象。這個函數返回的任何值都會作為第一個參數自動傳給下一項。
  第一次迭代發生在數組的第二項上,因此第一個參數是數組的第一項,第二個參數就是數組的第二項;

  ① reduce() 只有一個參數:函數

  

   cur的值是從數組的索引1元素開始的。prev第一個值是數組的索引0的元素,而后是上一次的prev+cur的和。

 

  ② reduce()  兩個參數:函數,歸並初始值;

   

    當設置了初始值,cur的值是從數組的索引0元素開始的。prev第一個值則是初始值,而后是上一次的prev+cur的和。

  ③ reduceRight()和reduce()的作用一樣,但是遍歷方向相反,不舉例了。

  ④ 應用例題,(參考 https://www.jianshu.com/p/2d396b10afe0)

   var str = 'name, age, hair\nMerble, 35, red\nBob, 64, blonde';
   處理str,得到 [ ["name", "age", "hair"], ["Merble", "35", "red"],["Bob", "64", "blonde"]];

   —》

var str = 'name,  age,  hair\nMerble,  35,  red\nBob,  64,  blonde';
var ss = str.split('\n')
//console.log(ss);//["name,  age,  hair", "Merble,  35,  red", "Bob,  64,  blonde"]
var a = ss.reduce(function (prev, cur) {
     prev.push(cur.split(",").map(function (item) {
            return item.trim();//去空格
      }))
      return prev
}, []); //初始值為空數組,值賦給第一個prev。
console.log(a);

 


  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM