iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
0

一組有序群集,值稱為元素element,位置稱為索引(index,由0開始)
創建Array兩種方式

  • 直接給值 var ary = [1,2,3]
  • 使用array建構式 var ary = new Array(1,2,3)
    • var ary = new Array(10) 宣告一個長度為10的array
  • 陣列操作: pop、push、shift、unshift

稀疏陣列(sparse)

索引非連續性的。

var ary= [1,2,,4];
ary.length; //return 4
ary[2]; // return undefined
2 in ary; // return false
// ----
var a= [0,undefined];
a.length; // return  2
a[1]; //return undefined
1 in a; //return true

push / delete

  • 新增元素

    • 新增至陣列最後ary.push(5)
    • 新增至陣列最前面ary.unshift(5)
  • 刪除元素 delete ary[2]

      var ary=[1,2,3,4,5];
      delete ary[2];
      2 in ary; // return false
      ary.length // return 5, 變成稀疏矩陣
    

陣列方法

join

將陣列轉成字串串接寫來,然後回傳此字串。

var a =[1,2,3,4,5];
a.join(); //return "1,2,3,4,5"
a.join("-"); // return "1-2-3-4-5" 

reverse

將陣列元素反轉。不會創建新的陣列,修改原陣列並回傳。

var a =[1,2,3,4,5];
a.reverse(); // return [5,4,3,2,1]
// a的值為[5,4,3,2,1],並非return一個新的陣列

sort

將陣列排序後回傳,不會創建新陣列。undefined會被排到最後。

排序為字母
var ary =["d","b","c","a"];
ary.sort(); //return ["a","b","c","d"]
// a的值為["a","b","c","d"],,並非return一個新的陣列
排序中有大小寫字母
var ary= ["B","d","C","a"];
ary.sort() // ary=["B", "C", "a", "d"],不符合排序

// 判斷大小寫
ary.sort(function(s,t){
var a = s.toLowerCase();
var b = t.toLowerCase();
if(a>b) return 1; // 大於0表示要對調
if(a<b) return -1; // 小於0表示不須對調
return 0; // 表示不用對調
})
// ary=["a", "B", "C", "d"]
若要排序的非字母

需使用function做判斷。

var ary= [2,33,1111,222];
ary.sort(); //return [1111, 2, 222, 33],不符合排序

function compare(a,b){
    return a-b; // 大於0代表需要對調
}

ary.sort(compare); // ary=[2,33,222,1111]

// 若要由大到小
function compare(a,b){
    return b-a;
}

concat

將多個陣列進行串接,然後回傳一個新的陣列。

var ary= [1,2,3];
ary.concat(4,5); // return [1,2,3,4,5]
ary.concat([4,5]); // return [1,2,3,4,5]
ary.concat([4,5],[6,7]); // return [1,2,3,4,5,6,7]

slice

將陣列切成子陣列,分別傳入兩個參數(開始位置與結束位置(不包含結束位置的元素)),然後回傳一個新的陣列。

var ary= [1,2,3,4,5];
ary.slice(1,3); //return [2,3]
ary.slice(3); // rerutn [4,5]
ary.slice(1,-1) // return [2,3,4] 
  • 使用的觀念與string slice 類似。

splice

用來插入或移除陣列元素的通用方法,會修改到原陣列。

  • 輸入兩個參數
    1. 指定要插入或刪除的起始位置
    2. 指定要移除的多少元素個數(可略)
刪除元素
var ary= [1,2,3,4,5,6,7,8];
ary.splice(4); // return [5,6,7,8],a=[1,2,3,4]

// 此時 a=[1,2,3,4]
ary.splice(1,2) // return [2,3],a=[1,4]

插入元素

var ary= [1,2,3,4,5,6,7,8];
ary.splice(2,0,"a","b"); // return [],a=[1,2,"a","b",3,4,5]

// 此時 a=[1,2,"a","b",3,4,5]
ary.splice(2,2,[1,2],3) // return ["a","b"],a=[1,2,[1,2],3,3,4,5,6,7,8]
  • ary.splice(2,0,"a","b") 第2個參數為0,所以並未刪除元素直接插入新元素
  • ary.splice(2,2,[1,2],3) 第2個參數為2,刪除了兩個元素["a","b"],且從第一個參數的位置開始插入新元素。

push / pop

  • push: 在陣列尾端新增元素,且回傳陣列長度。
  • pop: 刪除陣列最後的元素,且回傳被刪除元素。
var ary= [1,2,3,4,5]; 
ary.push(6,7); // reutnr 7, ary=[1,2,3,4,5,6,7]
ary.pop(); // return 7, ary=[1,2,3,4,5,6]
ary.push([9,0]) //return 7 ary=[1,2,3,4,5,6,[9,0]]

unshift / shift

  • unshift: 在陣列前端插入元素,且回傳長度。
  • shift: 在陣列前端刪除元素,且回傳刪除的元素。
var ary= [1,2,3,4,5]; 
ary.unshift(6,7); // return 7,ary=[6,7,1,2,3,4,5]
ary.shift(); // return 6,ary=[7,1,2,3,4,5]

toString

將陣列轉字串。

var ary=[1,2,3];
ary.toString(); // return "1,2,3"

[1,2,[3,"a"]].toString(); // return "1,2,3,a"

ES5 array 方法

forEach

將陣列所有元素歷遍一次。
Array.forEach(function(v,i,a){})

  • v: 陣列元素
  • i: 陣列索引
  • a: 陣列本身
var ary= [1,2,3,4,5];
var sum= 0;
ary.forEach(function(v){
    sum += v;
})
sum; //return 15

ary.forEach(function(v,i,a){
    a[i] = v*v;
})
ary; // [1,4,9,16,25];

forEach沒有類似break跳出迴圈,需透過throw error。

    ary.forEach(function(v){
        if(...){
            throw new Error("forEach error")
        }
    })

map

將陣列每個元素傳遞給指定的function,回傳一個新的陣列,與原陣列長度會一致。(不會修改到原陣列)

var ary= [1,2,3];
ary_1= ary.map(function(v){
    return v*v;
})

ary_1; // return [1,4,9],ary=[1,2,3]

filter

將陣列中符合條件的過濾出來,所以回傳的會是原陣列的子集合,不會修改到原陣列
array.filter(function(v){ return true/false }) 藉由邏輯判斷後回傳true/false,來確認是否符合條件。

var ary= [1,2,3];
ary_1= ary.filter(function(v){
    return v%2 !== 0;
});

ary_1; //return [1,3]

filter會跳過稀疏矩陣缺少的陣列。
var aryDense= sparseAry.filter(function(){return true;}) 可壓縮稀疏矩陣的空缺。
或是將undefined與null也都濾掉a= a.filter(function(){return x!= undefined && x!=null})

every / some

對陣列進行某些邏輯判斷,然後回傳true or false。

  • every: 全部都要符合條件才為true
var ary= [1,2,3];
ary.every(function(v){return v < 10;}) // return true,所有的元素都小於10
ary.every(function(v){return v%2==0;}) // return false,所有的元素都偶數
  • some: 只要元素有一個符合條件即為true
var ary= [1,2,3];
ary.some(function(v){return v%2==0;}) // return true,有一個元素成立
ary.some(NaN); // return false,沒有任何一個元素成立

在使用some時要注意到,當條件判斷是回覆true,則會停止往下收尋,且回覆true。當條件判斷是一直回覆false,則會一直往下尋找。

every與some剛好相反,當條件判斷是回覆false,則會停止往下收尋,且回覆false。當條件判斷是一直回覆true,則會一直往下尋找。

reduce / reduceRight

利用function將陣列元素進行組合,生成單個值。
array.reduce(function(x,y,z,k){...},initalVaue)

  • 兩個參數: (1)簡化函數 (2) 傳給function的初始值,option。
  • 簡化函數中傳入的第一個參數是到目前為止經過化簡函數的結果,接下來的2~4個參數會是依據傳入陣列的索引及元素。
  • 第一次進入函數則會使用reduce的第二個參數當初始值,若reduce無第二參數(表示無初始值),則會以陣列的第一個元素作為初始值。
var ary= [1,2,3,4,5];
var sum= ary.reduce(function(x,y){x+y},0)
  • (x,y)的變化狀況
x y
0 1
1 2
3 3
6 4
10 5
15
var ary= [11,21,13,25,15];
var max= ary.reduce(function(x,y){return x>y? x:y}); // reduce 無第二參數,初始值使用ary第一個元素 11
  • (x,y)的變化狀況
x y
11 21
21 13
21 25
25 15
25

reduceRight取值順序是由索引高的開始(陣列由右至左),其他操作與reduce雷同。

indexOf / lastIndexOf

收尋陣列中第一個符合條件的值,然後回傳它的索引。若無符合的回傳-1

  • indexOf: 由陣列開端開始收尋。
  • lastIndexOf: 由陣列尾端開始收尋。
a =[2,5,1,9,1,5]
a.indexOf(1); // reutrn 2, a[2]=1
a.lastInedxOf(1); // return 4 ,a[4]=1 
a.indexOf(3); // return -1
a.indexOf(5,2); //return 5, 從index=2之後開始收尋5,a[5]=5

string 也有indexOf與lastInedxOf,使用方式與上述一樣。

陣列的判斷

  • isArray
Array.isArray([]) // return true
Array.isArray({}) // return false

上一篇
Day 6: 物件 Object
下一篇
Day 8: 函數 function (Part 1)
系列文
Javascript 犀牛本-濃縮再濃縮 提煉再提煉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言