1. 建立和初始化數組
let daysOfWeek = new Array() //簡單的聲明并初始化一個數組
daysOfWeek = new Array(7) // 建立一個指定長度的數組
daysOfWeek = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday') // 直接将數組作為參數傳遞給它的構造器
daysOfWeek = [] // 最簡單的初始化一個數組
daysOfWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
console.log(daysOfWeek.length) // 使用length屬性通路數組有多少個元素
2. 通路和疊代數組
for(let i = 0; i < daysOfWeek.length; i++){
console.log(daysOfWeek[i]);
}
// 利用數組求斐波那契數列的前20個數。已知斐波那契數列中的前兩項是1,從第三項開始,每一項都等于前兩項的和。
const fibonacci = []
fibonacci[1] = 1
fibonacci[2] = 1 //已知斐波那契數列中的前兩項是1
for(let i = 3; i < 20; i++){
// 數組第一位的索引始終是0的。因為斐波那契數列不存在0,是以這裡直接略過,從第二位開始儲存斐波那契數列中對應位置的元素
// 已知前兩項,是以從第三項開始計算,每一項等于前兩項的和
fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2]
}
for(let i = 1; i < 20; i++){
// 列印每一項的結果
console.log(fibonacci[i]);
}
3. 添加元素
// 初始化一個0-9元素的數組
let numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3.1 在數組末尾插入元素
// 如果想要給數組添加一個元素(比如10),隻要把值賦給數組中最後一個空位上的元素即可
numbers[numbers.length] = 10
// push方法:把元素添加到數組的末尾
numbers.push(11)
numbers.push(12, 13)
console.log(numbers.length); //14
3.2 在數組開頭插入元素
現在,希望在數組中插入一個新元素(-1),不像之前那樣插入到最後,而是放到數組的開頭。 為了實作這個需求,首先要騰出數組裡第一個元素的位置,把所有元素向右移動一位。我們可以循環數組中的元素,從最後一位(長度值就是數組的末尾位置)開始,将對應的前一個元素(i - 1)的值賦給它(i),依次處理,最後把我們想要的值賦給第一個位置(索引0)上。可以将這段邏輯寫成一個函數,将該方法直接添加在Array的原型上,使所有數組的執行個體都可以通路到該方法。
Array.prototype.insertFirstPosition = function(value) {
// this指向的就是調用該函數的數組(numbers)
for(let i = this.length; i > 0; i--) {
this[i] = this[i -1]
}
this[0] = value
}
numbers.insertFirstPosition(-1)
console.log(numbers[0]); //-1
// 使用unshift方法
// 在JavaScript裡,數組有一個方法叫unshift,可以直接把數值插入數組的開頭
// 此方法的邏輯和insertFirstPosition方法的行為是一樣的
numbers.unshift(-2)
numbers.unshift(-4, -3)
// 周遊數組可以得到是從 -4 -3 ... 13
4. 删除元素
4.1 從數組末尾删除元素
// pop方法:删除數組最靠後的元素
numbers.pop() //删除13
4.2 從數組開頭删除元素
for(let i = 0; i < numbers.length; i++) {
numbers[i] = numbers[i + 1]
}
/*
把數組裡所有的元素都左移了一位,但數組的長度依然是17,這意味着數組中有額外的一個元素(值是undefined)。
在最後一次循環裡,i+1引用了數組裡還未初始化的一個位置。在Java、C/C++等語言裡,這樣寫可能會抛出異常,
是以不得不在numbers.length -1 處停止循環。
可以看到,上述代碼隻是把數組第一位的值用第二位覆寫了,并沒有删除元素,因為數組長度還是和之前一樣,
并且多了一個未定義元素。
要從數組中移除這個值,還可以建立一個包含剛才所讨論邏輯的方法,removeFirstPosition。但是,要真正從數組中移除
這個元素,我們需要建立一個新的數組,将所有不是undefined的值從原來的數組複制到新的數組中,并且将這個新的數組指派給我們的數組。
要完成這項工作,可以建立一個reIndex方法。
*/
Array.prototype.reIndex = function(myArray) {
const newArray = []
for(let i = 0; i < myArray.length; i++){
if(myArray[i] !== undefined){
newArray.push(myArray[i])
}
}
return newArray
}
Array.prototype.removeFirstPosition = function() {
for(let i = 0; i < this.length; i++) {
this[i] = this[i +1]
}
return this.reIndex(this)
}
// numbers = numbers.removeFirstPosition()
// 使用shift方法:删除第一個元素
numbers.shift() // -3到12
console.log(numbers.length) //16
5. 在任意位置添加或删除元素
- splice 方法
- 第一個參數:表示想要删除或插入的元素的索引值
- 第二個參數:删除元素的個數
- 第三個參數往後:要添加到數組裡的值(元素2,3,4)
// 删除了從數組索引5開始的3個元素。即numbers[5]、numbers[6]、numbers[7]這三個元素被删除。
numbers.splice(5, 3)
// 把數2,3,4插入到數組裡,放到了原本删除的位置上。
numbers.splice(5, 0, 2, 3, 4)
6. 二維和多元數組
6.1 二維數組
// 可以使用矩陣(二維數組,或數組的數組)來存儲這些資訊。矩陣的行儲存每天的資料,列對應小時級别的資料
let averageTemp = []
averageTemp[0] = [72, 75, 79, 79, 81, 81]
averageTemp[1] = [81, 79, 75, 75 ,73, 73]
6.2 疊代二維數組的元素
// 使用一個嵌套的for循環來處理,其中變量i為行,變量j為列
function printMatrix(myMatrix) {
for(let i = 0; i < myMatrix.length; i++){
for(let j = 0; j < myMatrix[i].length; j++){
console.log(myMatrix[i][j]);
}
}
}
printMatrix(averageTemp)
7. JavaScript的數組方法參考
- 數組的核心方法:
方法 | 描述 |
---|---|
concat | 連接配接2個或跟多數組,并傳回結果 |
every | 對數組中的每個元素運作給定函數,如果該函數對每個元素都傳回true,則傳回true |
filter | 對數組中的每個元素運作給定函數,傳回該函數會傳回true的元素組成的數組 |
forEach | 對數組中的每個元素運作給定函數。這個方法沒有傳回值 |
join | 将所有的數組元素連接配接成一個字元串 |
indexOf | 傳回第一個與給定參數相等的數組元素索引,沒有找到則傳回-1 |
lastIndexOf | 傳回在數組中搜尋到的與給定參數相等的元素的索引裡最大的值 |
map | 對數組中的每個元素運作給定函數,傳回每次函數調用的結果組成的數組 |
reverse | 颠倒數組中的元素的順序,原先第一個元素現在變成最後一個,同樣原先的最後一個元素變成了現在的第一個 |
slice | 傳入索引值,将數組裡對應索引範圍内的元素作為新數組傳回 |
some | 對數組中的每個元素運作給定的函數,如果任一進制素傳回true,則傳回true |
sort | 按照字母順序對數組排序,支援傳入指定排序方法的函數作為參數 |
toString | 将數組作為字元串傳回 |
valueOf | 和toString類似,将數組作為字元串傳回 |
7.1 數組合并
// concat 方法可以向一個數組傳遞數組、對象或是元素。數組會按照該方法傳入的參數順序連接配接指定數組。
const zero = 0
const positiveNumbers = [1, 2, 3]
const negativeNumbers = [-3, -2, -1]
let numbers1 = negativeNumbers.concat(zero, positiveNumbers)
console.log(numbers1) //[-3, -2, -1, 0, 1, 2, 3]
7.2 疊代器函數
// 如果數組裡的元素可以被2整除(偶數),函數就傳回true,否則傳回false
let numbers2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
const isEven = x => x % 2 == 0
// 7.2.1 用every方法疊代
everyResult = numbers2.every(isEven)
// 數組numbers2中第一個元素是1,它不是2的倍數,是以isEven函數傳回false,然後every執行結束
console.log(everyResult); //false
7.2.2 用some方法疊代
someResult = numbers2.some(isEven)
// 第一個被疊代的元素是1,傳回false。第二個被疊代的元素是2,傳回true——疊代結束
console.log(someResult); //true
7.2.3 用forEach方法疊代
// 疊代整個數組。和使用for循環的結果相同
numbers2.forEach(x => console.log(x % 2 == 0))
7.2.4 使用map和filter方法
// JavaScript有兩個會傳回新數組的疊代方法:map和filter
const myMap = numbers2.map(isEven)
console.log(myMap);
// [false, true, false, true, false, true, false, true, false, true, false, true, false, true, false]
const evenNumbers = numbers2.filter(isEven)
console.log(evenNumbers);
// [2, 4, 6, 8, 10, 12, 14] 過濾出都是偶數的數組
7.2.5 使用reduce方法
reduce方法接收一個有如下四個參數的函數:preViousValue、currentValue、index和array。因為index和array是可選參數,是以如果用不到它們,可以不傳。這個函數會傳回一個将被疊加到累加器的值, reduce方法停止執行後會傳回這個累加器。
// 如果要對一個數組中所有元素求和,就很有用
let reduceResult = numbers2.reduce((previous,current) => previous + current)
console.log(reduceResult) //120
7.3 ES6和數組的新功能
- ES2015和ES2016新增的數組方法:
方法 | 描述 |
---|---|
@@iterator | 傳回一個包含數組鍵值對的疊代對象,可以通過同步調用得到數組元素的鍵值對 |
copyWithin | 複制數組中一系列元素到同一數組指定的起始位置 |
entries | 傳回包含數組所有鍵值對的@@iterator |
includes | 如果數組中存在某個元素則傳回true,否則傳回false。ES2016新增 |
find | 根據回調函數給定的條件從數組中查找元素,如果找到則傳回該元素 |
findIndex | 根據回調函數給定的條件從數組中查找元素,如果找到則傳回該元素在數組中的索引 |
fill | 用靜态值填充數組 |
from | 根據已有數組建立一個新數組 |
keys | 傳回包含數組所有索引的@@iterator |
of | 根據傳入的參數建立一個新數組 |
values | 傳回包含數組中所有值的@@iterator |