數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)顧名思義 就是數(shù)據(jù)的結(jié)構(gòu)(邏輯結(jié)構(gòu) 存儲結(jié)構(gòu) 算法)
存儲結(jié)構(gòu)(數(shù)據(jù)存儲方式)
線性結(jié)構(gòu):
數(shù)組(順序表)
隊列
棧
堆
鏈表
非線性結(jié)構(gòu):
樹
圖
hash(數(shù)列表)
只要是能存數(shù)據(jù)的容器 就必須具備增刪改查的方法
數(shù)組
概述:數(shù)組是固定一類數(shù)據(jù)的組合(一般情況下 數(shù)組里面的數(shù)據(jù)類型一致)(多個數(shù)據(jù))
數(shù)組的聲明(引用數(shù)據(jù)類型)
1界酒、使用 [] 聲明數(shù)組
//里面的數(shù)據(jù)以,進行分隔
var arr=[1,2,3]
2笆呆、使用new 關(guān)鍵詞進行聲明(對象)
var arr=Array(10)//里面參數(shù)指定相應(yīng)的長度 如果你沒有寫 表示長度為0
var arr2=newArray(1,2,3,4)//當前數(shù)組里面的數(shù)據(jù)有1 2 3 4
length屬性來訪問對應(yīng)的長度(也可以進行設(shè)置)
var arr=newArray()
//? 通過length來訪問數(shù)組的長度
console.log(arr.length) //0
arr.length=11//設(shè)置對應(yīng)的長度
console.log(arr);
下標訪問
console.log(arr[0])//獲取第一個
//可以允許字符串
console.log(arr['0']);//獲取第一個
數(shù)組的賦值
arr[0]=10
console.log(arr[0]);//10
//給數(shù)組里面的元素隨機給值
var arr=newArray()
for(var i=0;i<10;i++) {
? ? arr[i]=Math.random()//0~1之間 包含0 不包含1
}
console.log(arr);
數(shù)組遍歷
傳統(tǒng)的for循環(huán)遍歷
var arr=[1,2,3,45,12]
//利用順序表達特點 有序
for(var i=0;i<arr.length;i++){
console.log(arr[i])
}
for in遍歷(只走對象 下標 迭代器 next)
var arr=[1,2,3,45]
for(var index in arr){//index表示為下標
console.log(arr[index])
}
for of進行遍歷(只走數(shù)組 迭代器來實現(xiàn)的)
//使用for of遍歷(只能遍歷數(shù)組)
for(var value of arr){//value表示的是里面的值
console.log(value);
}
數(shù)組的方法
數(shù)組是一個存儲結(jié)構(gòu)(增刪改查的操作)
添加(add push append)
棧方法(先進后出 后進先出)push入棧 pop出棧操作
push方法(將內(nèi)容添加到最后一個)
var arr=[1]
arr.push(10)
console.log(arr)//[1,10]
隊列方法(先進先出 后進后出)
將內(nèi)容追加到最前面
unshift方法(將內(nèi)容添加到第一個)
var arr=[i]
arr.unshift(10)
console.log(arr)//[10,1]
刪除(delete(硬刪)remove(軟刪)...)
棧方法
pop方法(刪除最后面)
var arr=[1,2,3]
arr.pop(0)//通過下標
console.log(arr)//[1槽棍,2]
隊列方法
shift方法(刪除第一個)
var arr=[1,2,3]
arr.shift()
console.log(arr)//[2,3]
修改(replace替換 update更新)
反轉(zhuǎn)reverse(將最后一個變到第一個? 一個個對應(yīng)的換位置)
//改變原來的數(shù)組
var arr=[1,2,3,4,8]
arr1=arr.reverse();//返回一個數(shù)組 這個數(shù)組就是反轉(zhuǎn)后的數(shù)組
arr1.unshift(10)//返回的反轉(zhuǎn)后的數(shù)組其實就是我們原本的數(shù)組
console.log(arr)//反轉(zhuǎn)后的結(jié)果[8,4,3,2,1]
console.log(Object.is(arr1,arr));//true
排序sort
//sort方法排序? //默認情況下它是根據(jù)第一個字符的ACSII碼進行排序(ACSII碼排序)
var arr2=[1,2,8,3,4,5]
arr2.sort()//返回一個數(shù)組 這個數(shù)組是排序好的數(shù)組 他跟上面一樣 就是返回的這個數(shù)組其實就是原本的數(shù)組
console.log(arr2);
// sort 其實就是一個高階函數(shù) 高階函數(shù)就是里面用函數(shù)作為參數(shù)的函數(shù)
var arr3=[15,20,18,11,4]
arr3.sort(function(a,b) {
//1和-1來進行大小區(qū)分和排序規(guī)則
return a-b//a-b是正序 b-a是倒序
})
console.log(arr3);
不影響原本數(shù)組的方法
concat(連接)
//不會影響原本數(shù)組的方法 返回新的數(shù)組
var arr=[1,2,3,4]
var arr1=[1,2,3,4]
var arr2=[1,2,3,4]
var arr3=[1,2,3,4]
//concat 連接 把多個數(shù)組變成一個數(shù)組 返回 ...拓展運算符 打開數(shù)組取出里面的值(...證明可以寫任意個)?表示可寫可不寫
varnewArr=arr.concat(arr1,arr2,arr3)
console.log(newArr);
slice(截壬ν铡)
//slice 切片 把一個數(shù)組里面東西提取出來 返回新的數(shù)組
var sliceArr=arr.slice()//全切
console.log(sliceArr);
var sliceArr1=arr.slice(1)//從1開始切到最后 如果下標不存在 返回一個空數(shù)組
console.log(sliceArr1);
var sliceArr2=arr.slice(2,3)//不包含結(jié)束的下標 但是包含開始的下標
console.log(sliceArr2);
//concat方法slice方法返回的數(shù)組跟原本的數(shù)組不是一個對象 但是里面的值或者對象他的地址是一樣的(淺拷貝)
var obj={
name:"jack"
}
var objArr=[obj]
var objArr1=objArr.concat()
var objArr2=objArr.slice()
console.log(objArr[0].name);//jack
objArr1[0].name='張三'
console.log(objArr2[0].name);//張三
console.log(objArr[0].name);//張三
splice方法(增加)
var arr2=[1,46,74,3,5,5]
arr2.splice(2,0,8)//下標 刪除的個數(shù)? 插入的值
console.log(arr2);//[1,46,8,74,3,5,5]
splice方法(刪除)
//splice會影響之前的數(shù)組 刪除 截取 插入
var arr=[12,18,38]
//參數(shù)有倆個 一個開始位置 一個刪除的個數(shù)(可寫可不寫) ?? 返回一個新的數(shù)組
// var newArr = arr.splice(0)//從第一個開始刪 或者刪除第一個
// console.log(newArr);
console.log(arr)
var newArr=arr.splice(1,2)
console.log(newArr);//獲取刪除的內(nèi)容 其實就是截取里面的內(nèi)容(不足是會改變之前的數(shù)組)