javascript基礎(chǔ)系列:數(shù)組常用方法解析

今天是比較特殊的日子,我們編程人員共同的節(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. 方案一
  1. 循環(huán)原有數(shù)組中的每一項(xiàng),每拿到一項(xiàng)都往新數(shù)組中添加
  2. 添加之前驗(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)
image.png
image.png

<a name="NcVm7"></a>

2. 方案二
  1. 先分別拿出數(shù)組中的每一項(xiàng)
  2. 用這一項(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--;
    }
  }
}
image.png
image.png

<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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容