- 學習JavaScript資料結構與演算法 的筆記, 包含一二三章
- 本人所有文章首發在部落格園: www.cnblogs.com/zhangrunhao…
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))
複製程式碼