學習JavaScript資料結構與演算法 (一)

張潤昊發表於2018-07-29

01基礎

迴圈

  • 斐波那契數列
var fibonaci = [1,1]
for (var i = 2; i< 20;i++) {
  fibonaci[i] = fibonaci[i-1] + fibonaci[i-2]
}
複製程式碼

02陣列

新增和刪除元素

  • push: 放到最後
  • pop: 取最後一個
  • unshift: 放到第一個
  • shifit: 取第一個
  • push 和 pop 模擬棧
  • unshift 和 pop 模擬佇列
// 因為最後引用了一個i+1, 但是i已經是小於length的最小索引
var arr = [0,1,2,3,4,5]
for (var i = 0;i<arr.length;i++) {
  arr[i] = arr[i+1]
}
console.log(arr) // [ 1, 2, 3, 4, 5, undefined ]
複製程式碼
  • pop和shift可以改變陣列的長度
  • pop和shift不接受傳參
  • spilce(index, length, ...補充的元素)取出陣列中間的元素, 並返回
  • splice改變原陣列

多維陣列矩陣

陣列常用方法

陣列合並

  • concat: 可以合併多個陣列
  • 引數如果是陣列, 進行解析合併.
  • 如果不是陣列, 例如物件, 函式, 或者其他型別的話, 會直接作為元素新增上去

迭代

  • map: 遍歷返回新陣列, 每一項由新的組成, 不改變原陣列
  • forEach: 遍歷陣列, 沒有返回結果, 不改變陣列. 但是可以通過引數進行改變
  • some: 一項返回true, 就是true
  • every: 每一項都返回true, 才是true
  • filter: 返回一個返回值true的值, 組成的新陣列
  • reduce: (pre, cur, index, arr) 每一項的結果向後疊加, 並返回新的操作結果

排序

  • reverse: 反轉
  • sort, (a, b) 接受一個函式引數. 根據函式返回的結果, 返回負數, a>b, a在前面
var arr = [1, 5, 4]
// a, b兩個數相比較, 返回小於0的數的話, a 放到前面
arr.sort((a, b) => {
  return a - b
})
console.log(arr) [1,4,5]
複製程式碼
  • 封裝陣列中是物件, 然後根據物件中的某個特定屬性進行排列
var obj1 = {
  age: 20
}
var obj2 = {
  age: 10
}
var arr = [obj1, obj2]

arr.sort(comp('age'))


function comp(key) {
  return (a, b) => {
    return a[key] - b[key]
  }
}
console.dir(arr)
複製程式碼
  • 重點: 返回的小於0的話, 那麼這個值就在前面.

搜尋

  • indexOf
  • lastIndexOf

陣列輸出為字串

  • join: 按照指定的字元拼接陣列的每一項, 返回. 如果什麼都不傳的話, 就是toString
  • toString

03棧

後進先出, 也是編譯器中儲存遍歷, 方法呼叫等的方式

實現棧

class Stack {
  constructor () {
    this.items = []
  }
  push(item) {
    return this.items.push(item)
  }
  pop() {
    return this.items.pop()
  }
  peek() {
    return this.items[this.items.length - 1]
  }
  isEmpty() {
    return this.items.length === 0
  }
  clear() {
    return this.items = []
  }
  size() {
    return this.items.length
  }
}
複製程式碼

利用棧實現十進位制轉其他進位制

  • 因為每一次取餘後, 都是一次壓棧操作, 放到最裡面
  • 操作完成後, 是出棧操作, 也就是從最上面開始取
  • 按照順序出棧, 拼接為字串即可
function divideBy(num, base) {
  var stack = new Stack, res = ''
  while (num > 0) {
    var rem = Math.floor(num % base)
    stack.push(rem)
    num = Math.floor(num / base)
  }
  while(!stack.isEmpty()) {
    res += stack.pop()
  }
  return res
}
var num = 10
console.log(divideBy(10, 8))
console.log(num.toString(8))
複製程式碼

相關文章