JavaScript數組知多少

數組的維基百科定義是:編程

編程語言中,數組數據結構(英語:array data structure),簡稱數組(英語:Array),是一種數據結構,是數據元素(elements)的集合。元素能夠經過索引來任意存取,索引一般是數字,用來計算元素之間存儲位置的偏移量。數組

不幸的是JavaScript沒有像此類數組同樣的數據結構,但提供了一種擁有一些類數組特性的對象,它把數組下標轉變成字符串,用其做爲屬性。數據結構

使用數組

1.建立數組

var numbers = [];    //[]操做符聲明瞭一個空的數組,長度爲0。

var numbers = new Array();    //與上等價

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

var numbers = new Array(1,2,3,4,5);    //構造函數傳入初始值

var numbers = new Array(5);     //只傳入一個參數,用來指定數組的長度

var objects = [1,"Joe",true, null];    //在 JavaScript 裏數組中的元素沒必要是同一種數據類型。

推薦使用 [ ] 操做符建立數組,這種方式效率更高。編程語言

JavaScript容許數組包含任意混合類型的值函數

var obj = ['string', 21, true, null, undefined, ['hzzly', 21], {object: true}, NaN];

2.數組長度

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

arr.length   //5

JavaScript數組的 length 是沒有上界的設計

若是你用大於或等於當前 length 的數字做爲下標來存儲一個元素,那麼 length 值會被增大以容納新元素,不會發生數組越界錯誤。code

var arr = [];

arr.length       //0

arr[1000] = true;

arr.length      //1001

//但 arr 只包含一個屬性

3.由字符串生成數組

split() 方法用於把一個字符串分割成字符串數組。對象

var str = 'hzzly';

var arr  = str.split('');

console.log(arr);   // ["h", "z", "z", "l", "y"]

4.對數組的總體性操做

當把一個數組賦給另一個數組時,只是爲被賦值的數組增長了一個新的引用。當你經過原引用修改了數組的值,另一個引用也會感知這個變化(淺複製)。而深複製是指將原數組中的每個元素都複製一份到新數組中。排序

存取函數

1.indexOf()

indexOf() 用來查找進來的參數在目標數組中是否存在。若是目標數組包含該參數,就返回該元素在數組中的索引;若是不包含,就返回-1。若是數組中包含多個相同的元素,indexOf()
函數老是返回第一個與參數相同的元素的索引。lastIndexOf(),該函數返回相同元素中最後一個元素的索引,若是沒找到相同元素,則返回-1。索引

var arr = ["h", "z", "z", "l", "y"];

arr.indexOf('h');  //0

arr.indexOf('l')   //3

arr.indexOf('z')   //1

arr.lastIndexOf('z')   //2

2.數組的字符串表示

join()toString() 方法都返回一個包含數組全部元素的字符串,默認各元素之間用逗號分開。當直接對一個數組使用 print()
函數時,系統會自動調用數那個數組的tostring()方法。

var arr = ["h", "z", "z", "l", "y"];

arr.join()   //"h,z,z,l,y"

arr.toString()   //"h,z,z,l,y"

3.由已有數組建立新數組

concat() 方法能夠合併多個數組建立一個新數,concat() 方法發起者是一個數組,參數是另外一個數組。做爲參數的數組,其中的全部元素都被鏈接到調用 concat() 方法的數組後面;
splice() 方法截取一個數組的子集建立一個新數組;splice() 方法從現有數組裏截取一個新數組,該方法的第一個參數是截取的起始索引,第二個參數是截取的長度。

var a = ['h','z'];

var b = ['z','l','y'];

var c = a.concat(b)   //["h", "z", "z", "l", "y"]

var myFish = ['angel', 'clown', 'mandarin', 'surgeon'];
// 移除 0 個元素從下標 2, 插入 'drum'
var removed = myFish.splice(2, 0, 'drum');
// myFish is ['angel', 'clown', 'drum', 'mandarin', 'surgeon']
// removed is [], 沒有元素被移除

// 移除下標爲 3 的元素
removed = myFish.splice(3, 1);
// myFish is ['angel', 'clown', 'drum', 'surgeon']
// removed is ['mandarin']

// 移除下標爲 2 的元素, 而後插入 'trumpet' 到下標 2 
removed = myFish.splice(2, 1, 'trumpet');
// myFish is ['angel', 'clown', 'trumpet', 'surgeon']
// removed is ['drum']

// 從下標爲 0 開始移除兩個元素, 而後插入 'parrot', 'anemone' and 'blue'
removed = myFish.splice(0, 2, 'parrot', 'anemone', 'blue');
// myFish is ['parrot', 'anemone', 'blue', 'trumpet', 'surgeon']
// removed is ['angel', 'clown']

// removes 2 elements from index 3
removed = myFish.splice(3, Number.MAX_VALUE);
// myFish is ['parrot', 'anemone', 'blue']
// removed is ['trumpet', 'surgeon']

可變數組

1.添加元素

push()方法會將一個元素添加到數組末尾,返回數組新長度值,也可使用數組的length屬性爲數組添加元素,但push()方法看起來更直觀。
unshift() 方法能夠將元素添加在數組的開頭,也能夠經過一次調用,爲數組添加多個元素。
splice()方法能夠爲數組添加元素,需提供以下參數:起始索引(亦即你但願添加元素的地方),須要刪除的元素個數(添加元素時該參數設爲0),想要添加數組的元素(栗子能夠看上面的)。

var arr=['h'];

arr.push('z');   //2   arr的值爲["h","z"]

arr.unshift('y')   //3   arr的值爲["y","h","z"]

2.刪除元素

pop() 方法能夠刪除數組末尾的元素,返回被刪除的值
shift() 方法能夠刪除數組的第一個元素,返回被刪除的值。數組中的元素自動前移,比pop慢的多
splice() 方法能夠指定要刪除的下標和個數,第一個參數是下標,第一個參數是要刪除元素的個數,返回值爲所刪除的元素

var arr = ["h", "z", "z", "l", "y"];

arr.pop()  //返回y     arr的值爲["h", "z", "z", "l"]

arr.shift()  //返回h     arr的值爲["z", "z", "l"]

arr.splice(1,2)  //返回["z", "l"]     arr的值爲["z"]

3.排序

reverse()方法將數組中元素的以中間位置進行翻轉。
sort() 會對數組按照字典順序進行排序。

使用sort()對數字排序,須要傳入一個大小比較函數:

function compare(num1,num2) {
    return num1 - num2;
}
var nums = [3,1,2,100,4,200];
nums.sort(compare);   //[1, 2, 3, 4, 100, 200]

迭代器方法

1.不生成新數組的迭代器方法

forEach() 該方法接受一個函數使用參數,對數組中的每一個元素使用該函數。
every() 該方法接受一個返回值爲布爾類型的函數,對數組中得每一個元素使用該函數,若是對於全部的元素,該函數都返回 true, 則該方法返回 true。
some() 該方法也接受一個返回值爲布爾類型的函數,只要有一個元素使得該函數返回true,該方法就返回 true。
reduce() 該方法接受一個函數,返回一個值。該方法會從一個累加值開始,不斷對累加值和數組中的後續元素調用該函數,直到數組中的最後一個元素,最後返回獲得的累加值;也能夠用來將數組中的元素鏈接成一個長的字符串。

var arr = [1,2,3,4,5]

arr.forEach(function(item,index){   //讓數組中的每一項作一件事情
    console.log(item,index)
})

var result = arr.every(function(item,index){   //檢測數組中的每一項是否符合條件
    return item > 0 
})

var result = arr.some(function(item,index){   //檢測數組中是否有某些項符合條件(只有知足一個即爲true)
    return item > 1 
})

var result = arr.every(function(pre,next){   //讓數組中的前項和後項作某種計算,並累計最終值
    return pre + next
})

2.生成新數組的迭代器方法

map() ,和 forEach() 類似,對數組中的每一個元素使用某個函數,區別在於返回一個新的數組,該數組的元素是對原有元素應用某個函數獲得的結果。
filter() ,和 every() 相似,傳入一個返回值爲布爾類型的函數,不一樣的是當對數組中紅全部元素應用該函數時,結果均爲 true 時, 該方法不返回
true,二十返回一個新數組,該數組包含應用該函數後結果爲true 的元素。

var arr = [1,2,3,4,5]
var newArr = arr.map(function(item,index){   //讓數組經過某種計算產生一個新數組
    return item * 2
})
newArr => [2,4,6,8,10]

var newArr2 = arr.filter(function(item,index){   //篩選出數組中符合條件的項,組成新數組
    return item > 3 
})
newArr2 => [4,5]

二維數組和多維數組

1.建立二維數組

Array.matrix = function(numrows,numcols,initial) {
    var arr = [];
    for (var i = 0; i < numrows; ++i) {
        var columns = []; 
        for (var j = 0; j < numcols; ++j) {
            columns[j] = initial;
        }
    arr[i] = columns;
    }
    return arr;
}

數組 完

以上皆爲我的觀點 如如有誤 還望指正

參考書籍

  1. 《JavaScript語言精粹》

  2. 《JavaScript高級程序設計》

相關文章
相關標籤/搜索