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開始
留言列表