close

Array的用法,和我們以前在C, C++的一些使用上有點類似,create Array有2種方式,一種是透過array literal, 另一種是透過Array() constructor

(1) array literal

    var empty = []; // empty array

    var dense = [1,2,3,4,5];

    var sparse = [1,,3]; // sparse array

    var undefine = [,,,]; // only has 2 elements

(2) Array() constructor

    var a = new Array(); // emtpy array

    var b = new Array(5); // array length is 5, but no elemenet till now

    var c = new Array(1,2,3,4,5); // [1,2,3,4,5]

    var d = new Array(1, true, "yes", 2.2); // mixed type element

 

讀取Array中某個element的值,可以經由square bracket []來取得

var a = [10]; // [10]

a[1] = "testing"; // [10, "testing"]

i = 2;

a[i] = 3; // [10, "testing", 3]

 

Array中的"length" property會自動的maintin,不管新增,刪除幾個element,它都會自動更新為當前的現況

array最重要的一點,是它本質上是object, array的index其實在內部是被表示為一個property,比如說

var a = [1,2,3];

可視為一個object如下

a = {"0": 1, "1":2, "2":3};

當我們去用a[0]想要去存取array中的第一個element時, 0為被轉型成為"0",再去比對object有無一個property name為"0"的property

 

Array的index只有正數,沒有負數

a[-1] = -1; // add a new property "-1" to a

 

因為array本質上是object, 所以一般像C會發生的out of boundary的問題,並不存在於java script中,當我們access一個不屬於此array中的property name時,它的行為會跟object一樣,return undefined。比如說

a = [0, 1, 2];

a[3]; // undefined 

 

java script中比較特別的是,它允許所謂的sparse array,所謂的sparse array,是指array中的index為不連續,而且length欄位的值,一定大於total element的個數

 

我們可以透過push, pop, unshift, shift, delete這些method來新增或刪除array之中的element。push及pop是作用在array tail,而unshift及shift是作用於array head

var a = [];

a.push(1); // [1]

a.push(2); // [1,2];

a.pop(); //[1]

var b = [];

b.unshift(1); // [1]

b.unshift2); // [2, 1]

b.shift(); [1]

var c = [1,2,3];

delete c[0]; // [2,3], length = 2 (in Chrome, [undefined, 2, 3], length = 3)

 

如何做array iteration?最簡單的,當然是透過for loop,或是用for/in loop,或是forEach method

for (var idx in SparseArray) {

    var value = SparseArray[idx];

}

不過因為array是一種object,而object是可以新增加property的,如果此時新增的property是一個method,那利用for/in loop來做iteration,並不是一種好方法

var data = [1,2,3,4, 5];

var product = 1;

data.forEach(function(n) {product *= n;}); // 120

 

Array method, join(), reverse(), sort(), concat(), slice(), splice(), push(), pop(), unshift(), shift(), toString(), toLocaleString()

var a = [1,2,3];

a.join(); // "1,2,3", if no separator is specified, use "," as default

a.join(" "); // "1 2 3"

a.join(""); // "123"

var b = [1,2,3];

b.revese(); // now b is [3,2,1]

var c = new Array("fusion", "bop", "post-rock");

c.sort(); // ["bop", "fusion", "post-rock"], default sort by alphabetical order

如果想要以alphabetical order以外的rule來做sorting,必需準備一個func餵給sort(),讓sort依據此func來決定sort完的順序

var a = [1,2,3];

a.concat(4); // [1,2,3,4], but a still is [1,2,3]

a.concat(4,5); // [1,2,3,4,5], but a still is [1,2,3]

a.concat([4,5]); // [1,2,3,4,5], 如果傳入conca中的參數為array,則會concatenate其中的element,而非整個array

a.concat(4, [5, 6]); // [1,2,3,4,5,6]

a.concat(4, [5, [6, 7]]); // [1,2,3,4,5[6,7]]

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

b.slice(2, 5); // [3,4,5], b still is [1,2,3,4,5,6,7]

b.slice(2); // [3,4,5,6,7]

b.slice(2,-1); // [3,4,5,6] // the 2nd parameter "-1" means last element in array

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

c.splice(3); // return [4, 5, 6], c is [1,2,3], remove element from 4rd to last one

c.splice(0, 2); // return [1,2], c is [3], remove element from 1st and the number of element to be removed is 2

c.splice(0, 0, 'a', 'b', 'c'); // ["a", "b", "c", 3], any parameter follow the 2nd one means insertion

在ECMASript 5之中,新定義了9個array methods,forEach(), map(), filter(), every(), some(), reduce, reduceRight(), indexOf(), lastindexOf()。這些method可以同時接受多個parameter做為參數,一般來說,第一個參教是element value,第二個是element的index,第三個是array

var input = [1,2,3];

var sum = 0;

input.forEach(function(value) {sum += value;});

sum; // 6

以上例來說,每個array中的element會被餵到unname function當中的"value",做為此function的參數,所以sum最後的結果將是此array中,每個element加總之後的和

var a = [1,2,3,4, 5];

var result = a.map(function(x) {return x/2;}); // result is [0.5, 1.0, 1.5, 2.0, 2.5], a is [1,2,3,4,5]

map func會回傳一個經由unnamed func處理過後的element,但原先的array其內容不變

var a = [-2, -1, 0, 1, 2];

var negative = a.filer(function(x) {return x < 0;}); [-2, -1], a is [-2, -1, 0, 1, 2]

var positive = a. filter(function(x) {return x > 0;}); [1, 2], a is [-2, -1, 0, 1, 2]

var sparse = [,,,,4]; // sparse array

var dense = sparse.filter(function(x) {return true}); // 針對nonexist的element,filter並不會去呼叫unnamed func,所以只有原本就存在的element,才會呼叫此unnamed func

var a = [1,2,3,4,5];

a.every(function(x) {return x > 0;}); // true, all elements are larger than 0

a.every(function(x) {return x > 3;}); // false, not all elements are larger than 3

every func會將每個element餵給unnamed func,並檢查是否回傳值是否為true,若有一個為false,則return false,反之需檢查至全部element所回傳之值皆為true,才會return true

var b = [1,2,3,4,5];

b.some(function(x) {return x%2 == 1;}); // true, some elements are odd number

some func會檢查是否存在至少一個element,當它餵進unnamed func時,其回傳值為true,若有一個則return true,反之需要全部的element其回傳值為false,才會return false

var a = [1,2,3,4,5];

var sum = a.reduce(function(x,y) {return x+y;}, 0); // sum = 15

var sum = a.reduce(function(x,y) {return x+y}); // sum = 15

reduce func中的第2個參數,是所謂的accumulator,如果有指定第二個參數的話,它會做為reuction過程中的初始值,若沒有,則引用array中第一個element為初始值。reduce中所使用的unnamed func,第一個參數為accumulator,第二個參數為下一個要做為reduction的element value。在第一個例子當中,accmulator為0, 0+1之後的結果會儲存在accumulator之中,之後再做為下一輪使用(1+2),所以可以把第一個例子想成是((((0+1)+2)+3)+4)+5)。第二個例子可視為((((1+2)+3)+4)+5)

reduceRight()和reduce的用法類似,只差在它是由index最高的element開始做reduction

var a = [0, 0, 0];

a.indexOf(0); // 0

a.lastIndexOf(0); 2

indexOf func會去搜尋array中,第一個符合的element index,而lastIndexOf則是以相反的順序,從尾巴開始搜尋

a.indexOf(0, 1); // 1

若在indexOf中,加入2nd parameter,它的含義是我們所要搜尋的起始點是由此idx開始

 

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 kiazo1 的頭像
    kiazo1

    隨手亂寫

    kiazo1 發表在 痞客邦 留言(0) 人氣()