今天是比較特殊的日子,我們編程人員共同的節(jié)日,1024,祝每個(gè)編程人員節(jié)日快樂(lè)!
數(shù)組是javascript必不可少的一項(xiàng),今天讓我們來(lái)總結(jié)一下數(shù)組操作的一些常用方法。
<a name="qRFkW"></a>
數(shù)組及數(shù)組中常用方法
數(shù)組是對(duì)象類型的,屬于特殊的對(duì)象
let ary = [12, 23, 34, 45]
console.log(typeof Ary) // =>"object"
console.dir(ary) // 1. 數(shù)字作為索引(key屬性名) 2. length代表長(zhǎng)度
<a name="5jmTj"></a>
數(shù)組中常用的方法
- 方法的作用和含義
- 方法的實(shí)參(類型和含義)
- 方法的返回值
- 原來(lái)的數(shù)組是否發(fā)生改變
<a name="0UDGi"></a>
1. 實(shí)現(xiàn)數(shù)組增刪改的方法
這一部分方法都會(huì)修改原有的數(shù)組
push
push:向數(shù)組末尾添加內(nèi)容
@params
多個(gè)任意類型
@return
新增后數(shù)組的長(zhǎng)度
let ary = [10, 20]
let res = ary.push(12, 30)
console.log(res) //4
console.log(ary) // [10, 20, 12, 30
// 基于原生js操作鍵值對(duì)的方法,也可以向末尾追加一項(xiàng)新的內(nèi)容
ary[ary.length] = 40
console.log(ary)
unshift
unshift:向數(shù)組開(kāi)始位置添加內(nèi)容
@params
多個(gè)任意類型
@return
新增后數(shù)組的長(zhǎng)度
let ary = [10, 20]
let res = ary.unshift(12, 30)
console.log(res) //4
console.log(ary) // [10, 20, 12, 30]
// 基于原生ES6展開(kāi)運(yùn)算符,把原有的ary克隆一份,在新的數(shù)組中創(chuàng)建第一項(xiàng),其余的內(nèi)容使用原始ary中的信息即可,也算
//實(shí)現(xiàn)了向開(kāi)始追加的效果
ary = [100, ...ary]
console.log(ary)
shift
shift:刪除數(shù)組中的第一項(xiàng)
@params
@return
刪除的那一項(xiàng)
let ary = [10, 20, 12, 30]
let res = ary.shift()
console.log(res, ary) // 10 [20, 12, 30]
基于原生js中的delete,把數(shù)組當(dāng)成普通的對(duì)象,確實(shí)可以刪除掉某一項(xiàng)內(nèi)容,但是不會(huì)影響數(shù)組本身的結(jié)構(gòu)特點(diǎn)(length長(zhǎng)度不會(huì)跟著修改),真實(shí)項(xiàng)目中杜絕這樣的刪除使用<br />
<br />pop
pop:刪除數(shù)組中的最后一項(xiàng)
@params@return
刪除的那一項(xiàng)
let ary = [10, 20, 30, 40]
let res = ary.pop();
console.log(res, ary) // 40, [10, 20, 30]
基于原生js讓數(shù)組長(zhǎng)度去掉一位,默認(rèn)刪除最后一項(xiàng)
let ary = [10, 20, 30, 40]
ary.length--;
console.log(ary)
<br />splice
splice:實(shí)現(xiàn)數(shù)組的增加、刪除、修改
@params
n, m都是數(shù)字, 從索引n開(kāi)始刪除m個(gè)元素(m不寫,是刪除到末尾)
n,m,x , 從索引n開(kāi)始刪除m個(gè)元素,用x占用刪除的部分
n, 0, x從索引n開(kāi)始,一個(gè)都不刪,把x放到索引n的前面
@return
把刪除的部分用新數(shù)組存儲(chǔ)起來(lái)返回
let ary = [10, 20, 30, 40]
let res = ary.splice(2,2)
console.log(res, ary)
// 基于這種方法可以清空一個(gè)數(shù)組,把原始數(shù)組中的內(nèi)容以新數(shù)組存儲(chǔ)起來(lái)
//ary.splice(0)
// 刪除最后一項(xiàng)和第一項(xiàng)
ary.splice(ary.length-1)
ary.splice(0,1)
console.log(ary)
// 向數(shù)組末尾追加
ary.splice(ary.length,0, 'aaa')
//向數(shù)組開(kāi)始追加
ary.splice(0,0,'aaa')
<a name="7WJSh"></a>
2. 數(shù)組的查詢和拼接
此組方法,原來(lái)數(shù)組不會(huì)改變
slice
slice: 實(shí)現(xiàn)數(shù)組的查詢
@params
n, m都是數(shù)字,從索引n開(kāi)始,找到索引為m的地方(不包括m)
@return
把找到的內(nèi)容以一個(gè)新數(shù)組的形式返回
let ary = [10, 20, 30, 40, 50]
let res = ary.slice(1, 3)
console.log(res, ary) // [20, 30] [10, 20, 30, 40, 50]
// 數(shù)組克隆,參數(shù)0可以不寫,淺克隆
let res2 = ary.slice(0)
concat
slice: 實(shí)現(xiàn)數(shù)組的拼接
@params
多個(gè)熱任意類型值
@return
拼接后新的數(shù)組(原來(lái)的數(shù)組不變)
let ary1 = [10, 20, 30]
let ary2 = [40, 50, 60]
let res = ary1.concat('嵐楓', ary2);
console.log(res)
<a name="mXdOF"></a>
3. 把數(shù)組轉(zhuǎn)化為字符串
原有數(shù)組不變
toString
toString: 把數(shù)組轉(zhuǎn)換為字符串
@params
@return
轉(zhuǎn)換后的字符串,每一項(xiàng)用逗號(hào)分隔(原來(lái)的數(shù)組不變)
let ary = [10, 20, 30]
let res = ary.toString();
console.log(res) // "10, 20, 30"
console.log([].toString()) // ""
join
join: 把數(shù)組轉(zhuǎn)換為字符串
@params
指定的分隔符(字符串格式)
@return
轉(zhuǎn)換后的字符串,每一項(xiàng)用指定分隔符分隔(原來(lái)的數(shù)組不變)
let ary = [10, 20, 30]
let res = ary.join(' ');
console.log(res) // "10 20 30"
<a name="EhV2n"></a>
4. 檢測(cè)數(shù)組中是否包含某一項(xiàng)
indexOf/lastIndexOf
indexOf/lastIndexOf: 檢測(cè)當(dāng)前項(xiàng)在數(shù)組中第一次或者最后一次索引值,(在ie6-8中不兼容)
@params
要檢索的這一項(xiàng)內(nèi)容
@return
這一項(xiàng)出現(xiàn)的位置索引值(數(shù)字),如果數(shù)組中沒(méi)有這一項(xiàng),返回的結(jié)果是-1
let ary = [10, 20, 30, 10, 20, 30]
console.log(ary.indexOf(20)) // 1
console.log(ary.lastIndexOf(20)) // 4
// 驗(yàn)證ary數(shù)組是否包含‘嵐楓’
if(ary.indexOf('嵐楓') === -1) {
//不包含
}
// 直接使用ES6新提供的includes方法判斷
if(ary.includes('嵐楓')) {
// 包含:如果存在返回的是true
}
<a name="g2PtA"></a>
5. 數(shù)組的排序或者排列
reverse
reverse:把數(shù)組倒過(guò)來(lái)排列
@return
排列后的新數(shù)組,原來(lái)的數(shù)組改變
let ary = [12, 15, 9, 28]
ary.reverse();
console.log(ary)
sort
sort:實(shí)現(xiàn)數(shù)組的排序
@params
可以沒(méi)有,也可以是個(gè)函數(shù)
@return
排列后的新數(shù)組,原來(lái)的數(shù)組改變
如果不傳參數(shù),是無(wú)法處理10以上的數(shù)字排序(它默認(rèn)都是按照第一個(gè)字符來(lái)排)
// 想要實(shí)現(xiàn)多位數(shù)正常排序,需要給sort傳遞一個(gè)函數(shù),函數(shù)中返回a-b升序,返回b-a實(shí)現(xiàn)降序
let ary = [10, 12, 15,22, 28, 9]
ary.sort((a, b) => {
// a和b是相鄰的兩項(xiàng)
return a-b
})
console.log(ary)
<a name="PtbIn"></a>
6. 遍歷數(shù)組中的每一項(xiàng)方法
forEach
forEach: 遍歷數(shù)組中的每一項(xiàng)內(nèi)容
@params
回調(diào)函數(shù)
@return
原來(lái)的數(shù)組不變
let ary = [12, 15, 9, 28, 10, 22]
//基于原生js中的循環(huán)可以實(shí)現(xiàn)
for(let i=0; i< ary.length; i++) {
// i: 當(dāng)前循環(huán)這一項(xiàng)的索引
//ary[i]: 根據(jù)索引獲取循環(huán)的這一項(xiàng)
}
ary.forEach((item, index)=> {
// 數(shù)組中有多少項(xiàng),函數(shù)就會(huì)被默認(rèn)執(zhí)行多少次
// 每一次執(zhí)行函數(shù): item是數(shù)組中當(dāng)前要操作的這一項(xiàng),index是當(dāng)前的索引值
})
map<br />filter<br />find<br />reduce<br />some<br />every
<a name="62fOo"></a>
數(shù)組中的去重
<a name="eD7de"></a>
1. 方案一
- 循環(huán)原有數(shù)組中的每一項(xiàng),每拿到一項(xiàng)都往新數(shù)組中添加
- 添加之前驗(yàn)證新數(shù)組中是否存在這一項(xiàng),不存在再增加
let ary = [1, 2,3, 1, 2, 1, 2, 1, 2, 3, 2, 1, 2, 3]
let newAry = [];
for(let i = 0; i< ary.length; i++) {
// 循環(huán)獲取原有數(shù)組中的每一項(xiàng)
let item = ary[i]
// 驗(yàn)證新數(shù)組中是否存在這一項(xiàng)
if(newAry.includes(item)) {
// 存在這一項(xiàng),不再增加到新數(shù)組中,繼續(xù)下一輪循環(huán)即可
continue;
}
newAry.push(item)
}
console.log(newAry)

<a name="NcVm7"></a>
2. 方案二
- 先分別拿出數(shù)組中的每一項(xiàng)
- 用這一項(xiàng)和它后面的每一項(xiàng)依次進(jìn)行比較,如果遇到和當(dāng)前項(xiàng)相同的,則在原來(lái)數(shù)組中把這一項(xiàng)從數(shù)組中刪除,用splice方法
var ary = [1, 2,3, 1, 2, 1, 2, 1, 2, 3, 2, 1, 2, 3];
for(var i = 0 ; i < ary.length; i++) {
// item: 每一次循環(huán)拿出來(lái)的當(dāng)前項(xiàng)
var item = ary[i];
// 讓當(dāng)前項(xiàng)和后面的每一項(xiàng)進(jìn)行比較(循環(huán))
for(var j= i+1; j< ary.length; j++) {
var compare = ary[j];
// 如果compare和item相等,說(shuō)明這一項(xiàng)是重復(fù)的,我們把它刪掉
if(compare === item) {
// j索引這一項(xiàng)要從數(shù)組中刪除
ary.splice(j, 1);
// 數(shù)組塌陷了: j后面的每一項(xiàng)索引都提前了一位,下一次要比較的應(yīng)該還是j這個(gè)索引內(nèi)容
j--;
}
}
}

<a name="3nPDC"></a>
3. 數(shù)組中去重比較好的方法
let ary = [1, 2, 3, 1, 2, 1, 2, 3, 2, 1, 2, 3]
// 1. 創(chuàng)建一個(gè)空對(duì)象
let obj = {}
// 2. 循環(huán)數(shù)組中的每一項(xiàng),把每一項(xiàng)對(duì)象中進(jìn)行存儲(chǔ) =》 item: item
for(let i=0; i< ary.length; i++) {
let item = ary[i]
//3. 每一次存儲(chǔ)之前進(jìn)行判斷:驗(yàn)證obj中是否存在這一項(xiàng)
if(obj[item] !== undefined) {
// 已經(jīng)存在這一項(xiàng)
ary[i] = ary[ary.length-1]
ary.length--;
i--;
continue;
}
obj[item] = item
}
console.log(ary)
基于splice實(shí)現(xiàn)刪除性能不好:當(dāng)前項(xiàng)被刪除后,后面的每一項(xiàng)的索引都要向前提一位,如果后面內(nèi)容過(guò)多,一定影響性能<br />實(shí)現(xiàn)數(shù)組去重的方法
unique: 實(shí)現(xiàn)數(shù)組去重的方法
@params
ary[Array]要去重的數(shù)組
@return
[Array] 去重后的數(shù)組
function unique(ary){
let obj = {}
for(let i=0; i< ary.length; i++) {
let item = ary[i]
if(obj[item] !== undefined) {
ary[i] = ary[ary.length-1]
ary.length--;
i--;
continue;
}
obj[item] = item
}
return ary
}
console.log(unique([1,1,2,2,4,4]))
<a name="oCmvn"></a>
4. 基于ES6的Set去重方法
let ary = [12, 23, 12, 15, 25,23, 25, 14, 16]
ary = [... new Set(ary)];
console.log(ary)