天天看點

Javascript資料結構—數組

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

繼續閱讀