JavaScript數(shù)組方法持續(xù)更新

JavaScript數(shù)組方法持續(xù)更新

作為 js 的重要一員控嗜,一定要好好了解一番曾掂,若有理解不到之處,還望不吝指教许蓖。

何為數(shù)組,是有序的集合。

一赃额、如何判斷是否是數(shù)組


  1. Array.isArray() 字面上的理解竹勉,是不是一個(gè)數(shù)組桨啃。

    let arr = []
    let str = '[]'
    Array.isArray(arr) // true
    Array.isArray(str) // false
    
  2. instanceof 是不是 Array 的實(shí)例丧慈。

    let arr = []
    let str = '[]'
    arr instanceof Array // true
    str instanceof Array // false
    
  3. constructor , 實(shí)例對(duì)象的隱式原型指向?qū)ο蟮臉?gòu)造函數(shù)簇搅。

    let arr = []
    arr.constructor === Array // true
    
  4. Object.prototype.toString.call(arr) === '[object Array]'

    let arr = []
    Object.prototype.toString.call(arr) === '[object Array]' // true
    

二姿现、創(chuàng)建數(shù)組


  • 字面量

    let arr = []
    
  • new Array()

    let arr = new Array()
    
  • split()

    let str = '1,2,3'
    let arr = str.split(',')
    
  • Array.from()

    // 將字符串轉(zhuǎn)換成數(shù)組
    let str = '123'
    let arr = Array.from(str) // ["1","2","3"]
    
    // 將 arguments 偽數(shù)組轉(zhuǎn)換為數(shù)組
    Array.from(arguments)
    
    // 將 dom 元素偽數(shù)組轉(zhuǎn)換為數(shù)組
    Array.from(document.querySelectorAll('div'))
    

    Array.from 接受3個(gè)參數(shù)

    • 第一個(gè)參數(shù)必填提佣,需要轉(zhuǎn)換的對(duì)象
    • 第二個(gè)可選天试,接受一個(gè)回調(diào)函數(shù)槐壳,數(shù)組中的每一項(xiàng)都會(huì)回調(diào)該函數(shù)
    • 第三個(gè)可選,綁定回調(diào)函數(shù)的 this 指向
  • Array.of() 無(wú)論什么類(lèi)型雳攘,包裹一層變成數(shù)組

    Array.of() 
    Array.of('') 
    Array.of(null)
    Array.of(undefined) 
    Array.of(NaN) 
    Array.of(()=>{}) 
    Array.of({}) 
    Array.of(123) 
    

三吨灭、數(shù)組的方法


關(guān)注一個(gè)方法或者函數(shù)浑彰,主要關(guān)注以下幾點(diǎn)

  1. 參數(shù)
  2. 返回值

常用的數(shù)組方法

? 不改變?cè)瓟?shù)組

? forEach map filter some every find findIndex concat indexOf lastindexOf slice flat includes

? join reduce

? 改變?cè)瓟?shù)組

? push unshift pop shift splice fill sort reverse

  • forEach()

    /*  接受 2 個(gè)參數(shù)
     *    第一個(gè)參數(shù)必填周伦,回調(diào)函數(shù)
     *    第二個(gè)參數(shù),綁定回調(diào)函數(shù)的 this 指向, (例子里的 obj)
     */
    Array.forEach( (item,index,Array) => {
      // item 表示數(shù)組當(dāng)前循環(huán)到的項(xiàng)
      // index 表示數(shù)組當(dāng)前循環(huán)項(xiàng)的下標(biāo)值
      // Array 表示原數(shù)組
    },obj)
    

    forEach 不能中斷循環(huán)(break),只能跳過(guò)當(dāng)前循環(huán)項(xiàng)未荒,進(jìn)入下一項(xiàng)的循環(huán)寨腔。

    該方法返回值為 undefined

  • map() , 參數(shù)同 forEach 方法。

    // 不能直接跳出循環(huán) break 會(huì)報(bào)錯(cuò)划纽, return 也不行
    let arr = [1,2,3]
    let res = arr.map((item)=>{
     return item + 1
    })
    

    返回值為一個(gè)新的數(shù)組脆侮,不改變?cè)瓉?lái)的數(shù)組。

  • filter(), 一般用來(lái)過(guò)濾數(shù)組中的元素,參數(shù)同 forEach 方法

    let obj = {}
    let arr = [
      {
        id: 1,
      },
      {
        id: 2,
      },
      {
        id: 3,
      },
    ]
    let newArr = arr.filter((item, index, Array) => {
      // 必須 return ,且新數(shù)組只會(huì)含有條件為 true 的項(xiàng)
      return item.id == 2
    }, obj)
    console.log(newArr) // [{id: 2}]
    

    返回值為一個(gè)新數(shù)組勇劣,不改變?cè)瓟?shù)組

  • some() 靖避,參數(shù)同 forEach

    arr.some( (item, index, Array) => {
       // 有一項(xiàng)滿(mǎn)足條件,則返回 true ,剩余的項(xiàng)不在參與循環(huán)比默;沒(méi)有滿(mǎn)足條件幻捏,返回 false
       // 有點(diǎn) 邏輯 || 的意思,只是參與的項(xiàng)不同。
       return item.id === 2
    }, obj)
    

    返回值 Boolean 類(lèi)型命咐, true or false

  • every()篡九,參數(shù)同 forEach

    /* 和 some() 方法相似,有一項(xiàng)是 false 則終止循環(huán)醋奠,返回 false榛臼,每一項(xiàng)都是 true ,返回 true
     * 這個(gè)完全和 && 的思想一致
     */
    

    返回值 Boolean 類(lèi)型, true or false

    tips: 空數(shù)組是個(gè)特例窜司,始終返回 true

  • find()沛善,參數(shù)同 forEach

    /* 
     *  找到匹配的項(xiàng)則返回第一個(gè)匹配項(xiàng),循環(huán)終止塞祈;找不到則返回 undefined
     */
    

    返回值金刁,匹配的項(xiàng) 或者 undefined

  • findIndex(),參數(shù)同forEach

    // 匹配到選項(xiàng)則返回第一個(gè)匹配項(xiàng)的索引议薪,循環(huán)終止尤蛮,否則返回 -1
    

    返回值,匹配到的下標(biāo)值 或者 -1

  • push()

    // 在數(shù)組的最后增加元素
    let arr = [1,2]
    arr.push(3) // 一個(gè)參數(shù)
    let res = arr.push(4,5,6) // 多個(gè)參數(shù)
    console.log(res) // [1, 2, 3, 4, 5, 6]
    console.log(arr) // 6
    

    返回?cái)?shù)組的長(zhǎng)度斯议,并改變?cè)瓟?shù)組

  • unshift()

    let arr = [1,2]
    arr.unshift(0) // 3
    

    返回?cái)?shù)組的長(zhǎng)度产捞,并改變?cè)瓟?shù)組

  • pop(), 不需要參數(shù)

    // 從數(shù)組的最后開(kāi)始刪除一個(gè)元素
    let arr = [1,2]
    arr.pop()  // 2
    

    返回被刪除元素,空數(shù)組刪除返回 undefined捅位,改變?cè)瓟?shù)組轧葛,

  • shift(), 不需要參數(shù)

    // 從數(shù)組的開(kāi)頭開(kāi)始刪除一個(gè)元素
    let arr = [1,2]
    arr.shift() // 1
    

    返回被刪除元素搂抒,空數(shù)組刪除返回 undefined,改變?cè)瓟?shù)組尿扯,

  • concat(), 拼接數(shù)組

    let arr = [1, 2]
    let arr1 = [3, 4]
    let arr2 = [5, 6]
    let newArr = arr.concat(arr1, arr2) // 數(shù)組的拼接
    let newArr2 = newArr.concat() // 數(shù)組的淺拷貝
    

    返回值為新的數(shù)組求晶, 不改變?cè)瓉?lái)的數(shù)組

  • indexOf()lastIndexOf()

    // 找到第一次匹配元素的索引值,否則返回 -1
    let arr = [1,2,3,4]
    arr.indexOf(2, 0) // 從索引為 0 的位置開(kāi)始向數(shù)組的末尾查找
    arr.lastIndexOf(2, arr.length-1) // 從索引為 arr.length-1 的位置開(kāi)始向數(shù)組的開(kāi)頭查找
    

    返回值為匹配的下標(biāo) 或者 -1

  • slice(), 淺拷貝數(shù)組

    let arr = [1,2,3,4,5,6]
    // 包含開(kāi)始位置衷笋, 不包含結(jié)束位置
    arr.slice(1,2) // [2]
    

    返回值 新的數(shù)組芳杏, 不改變?cè)瓟?shù)組

  • splice(), 萬(wàn)金油的存在辟宗,增爵赵、刪、改功能泊脐。

    let arr = [1, 2, 3]
    
    /*  刪除功能空幻,任意位置刪除
     *  參數(shù)1. 開(kāi)始的索引位置,包含該位置
     *  參數(shù)2. 刪除的個(gè)數(shù)
     *  返回值:返回刪除的元素的一個(gè)數(shù)組容客,改變?cè)瓟?shù)組
     */
    arr.splice(0, 1)  // [1]
    console.log(arr)  // [2, 3]
    
    /*  增加功能秕铛,任意位置增加元素
     *  參數(shù)1. 開(kāi)始的索引位置,也可以理解為新數(shù)組的索引位置上插入新的項(xiàng)缩挑。
     *  參數(shù)2. 刪除個(gè)數(shù)為 0
     *  參數(shù)3. 增加的項(xiàng)
     *  返回值:空數(shù)組但两,改變?cè)瓟?shù)組
     */
    arr.splice(1, 0, 1, 2, 3)  // []
    console.log(arr)  // [2, 1, 2, 3, 3]
    
    /*  修改功能,任意位置修改供置,這個(gè)就是增加功能的變形
     *  參數(shù)1. 開(kāi)始索引位置谨湘,包含該位置
     *  參數(shù)2. 替換的個(gè)數(shù) n,包含從索引參數(shù)1開(kāi)始在內(nèi)的向后 n 項(xiàng)將會(huì)從數(shù)組去除
     *  參數(shù)3. 替換的項(xiàng)芥丧, 在數(shù)組索引參數(shù)1位置紧阔,向后插入替換的項(xiàng)
     *  返回值: 空數(shù)組,改變?cè)瓟?shù)組
     */
    arr.splice(1, 2 ,{id:1},{id:2})
    
    

    主要是參數(shù)的靈活運(yùn)用续担,組成不同的功能寓辱,很實(shí)用。

  • copyWithin()

    /* 從數(shù)組內(nèi)部替換自身項(xiàng)
     * 參數(shù)1. 替換元素開(kāi)始的位置
     * 參數(shù)2. 從該索引開(kāi)始復(fù)制數(shù)據(jù)赤拒,默認(rèn)是0
     * 參數(shù)3. 復(fù)制數(shù)據(jù)結(jié)束的索引值,不包含該位置诱鞠,默認(rèn)到數(shù)組的結(jié)束
     * 返回值:修改后的新數(shù)組
     */
    let arr = [1, 2, 3, 4]
    arr.copyWithin(0,1,2) // [2,2,3,4]
    

    返回值為新的數(shù)組挎挖,改變?cè)瓟?shù)組

  • fill()

    /*  填充數(shù)組
     *  參數(shù)1. 用來(lái)填充數(shù)組的值
     *  參數(shù)2. 起始索引值,默認(rèn)是 0 
     *  參數(shù)3. 終止索引值航夺,不包含該項(xiàng)蕉朵,默認(rèn)是數(shù)組的長(zhǎng)度
     */
    let arr = []
    arr.fill(1, 0, 10) // 無(wú)法改變空數(shù)組,只能改變已有的項(xiàng)
    arr = [1, 2, 3, 4]
    arr.fill(5, 1 ,2) // [1,5,3,4]
    

    返回值為改變后的數(shù)組阳掐,改變?cè)瓟?shù)組

  • flat()

    /*  多維數(shù)組變成一維數(shù)組
     *  參數(shù) 指定展開(kāi)嵌套數(shù)組的深度始衅,Infinity 表示任意深度
     *  不傳可以去除數(shù)組中的空項(xiàng)
     *  返回值:新的的數(shù)組冷蚂,不改變?cè)瓟?shù)組
     */
    let arr = [1, 2, [3, 4]]
    arr.flat(1)   // [1, 2, 3, 4]
    
    let arr1 = [1, 2, 3, , ,4]
    arr1.flat() // [1, 2, 3, 4]
    

    返回值:新的的數(shù)組,不改變?cè)瓟?shù)組

  • flatMap(),參數(shù)同 forEach

    /*  循環(huán)數(shù)組汛闸,每一項(xiàng)執(zhí)行一個(gè)函數(shù)蝙茶,最終執(zhí)行以下flat()方法
     *  返回值:新的數(shù)組,不會(huì)改變?cè)瓟?shù)組 
     */
    let arr = [1, 2]
    arr.flatMap( (item) => {
        [item, item * 2]
    }) // [1,2,2,4]
    

    flatMap 只能展開(kāi)一層數(shù)組

  • includes()

    /*  判斷數(shù)組是否含有某個(gè)指定的值
     *  參數(shù)1. 包含項(xiàng)
     *  參數(shù)2. 檢索的開(kāi)始位置诸老,包含該位置
     *  返回值:包含返回 true , 不包含返回 false
     */
    console.log([1, 2, 3].includes(3));    // true
    console.log([1, 2, 3].includes(3, 3))  // false
    console.log([1, 2, 3].includes(3, 2))  // true
    

    也可用于字符串的檢索隆夯,區(qū)分大小寫(xiě)

  • sort()

    /*  排序
     *  參數(shù)1. 
     *  參數(shù)2. 
     *  規(guī)則
     *    - 不傳值,則是轉(zhuǎn)化為字符串逐位比較 ASCII 大小
     *    - 接收一個(gè)函數(shù)别伏,函數(shù)有個(gè)兩個(gè)參數(shù) a b
     *        若 a 小于 b蹄衷,在排序后的數(shù)組中 a 應(yīng)該出現(xiàn)在 b 之前,則返回一個(gè)小于 0 的值厘肮。
     *        若 a 等于 b愧口,則返回 0。
     *        若 a 大于 b类茂,則返回一個(gè)大于 0 的值耍属。
     *  返回值:新的排序后的數(shù)組
     */
    let arr = [1,5,2,10]
    arr.sort((a, b) => {
        // a - b 返回值為正數(shù),則交換兩項(xiàng)的位置
        return a - b
    }) // [1,2,5,10] 從小到大
    arr.sort((a, b) => {
        return b - a
    }) // [10,5,2,1] 從大到小
    

    返回值為有序的新數(shù)組大咱,改變?cè)瓟?shù)組

  • reverse()

    let arr = [1, 2, 3]
    arr.reverse() // [3, 2, 1]
    

    反轉(zhuǎn)數(shù)組恬涧,改變?cè)瓟?shù)組

  • toLocaleString()toString()

    /*  將數(shù)組的每一項(xiàng)使用 toLocaleString 或者 toString
     *  不同點(diǎn)是語(yǔ)言環(huán)境的不同
     *  返回值:字符串,不改變?cè)瓟?shù)組
     */
    let arr = [1, 'a', { id: 1 }, new Date()]
    // 1,a,[object Object],2020/5/22 下午2:44:40
    console.log(arr.toLocaleString())
    // 1,a,[object Object],Fri May 22 2020 14:44:40 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
    console.log(arr.toString())
    

    返回值:字符串碴巾,不改變?cè)瓟?shù)組

  • join()

    /*  將數(shù)組使用特定的符號(hào)進(jìn)行分割
     *  返回值:字符串溯捆,不改變?cè)瓟?shù)組
     */
    let arr = [1, 2, 3]
    arr.join() // 1,2,3
    arr.join('') //123
    arr.join('*') //1*2*3
    

    和 split 更配哦

  • reduce(), 實(shí)用且重要的方法厦瓢。

    /*  累加和累計(jì)這種描述特貼切
     *  參數(shù)1. 一個(gè)處理函數(shù),接收 4 個(gè)參數(shù)
     *      - pre 第一次為參數(shù)2的值提揍,然后是每次 處理函數(shù) 返回的值
     *    — val 當(dāng)前循環(huán)項(xiàng)
     *    - index 當(dāng)前循環(huán)項(xiàng)索引
     *    — arr 當(dāng)前數(shù)組
     *  參數(shù)2. 第一次 pre 的值,默認(rèn)是數(shù)組的第一個(gè)值煮仇。
     */
    let str = '好好學(xué)習(xí)天天向上'
    let arr = str.split('')
    let i = 0
    let res = arr.reduce((pre, val, index, arr) => {
      console.log(i++)
      console.log(`pre:${pre}`)
      console.log(`val:${val}`)
      return pre + val
    }, '我會(huì)')
    console.log(res) // 我會(huì)好好學(xué)習(xí)天天向上
    

    返回值為累計(jì)的結(jié)果劳跃,不會(huì)改變?cè)瓟?shù)組

  • reduceRight()

    和 reduce 的結(jié)果一樣,不同的是從數(shù)組的最后開(kāi)始浙垫。

參考


[ MDN ]:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array
[ 掘金 ]: https://juejin.im/post/5d1ff6def265da1b855c777f#heading-22

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刨仑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夹姥,更是在濱河造成了極大的恐慌杉武,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辙售,死亡現(xiàn)場(chǎng)離奇詭異轻抱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)旦部,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)祈搜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)较店,“玉大人,你說(shuō)我怎么就攤上這事容燕×撼剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵缰趋,是天一觀的道長(zhǎng)捧杉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)秘血,這世上最難降的妖魔是什么味抖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮灰粮,結(jié)果婚禮上仔涩,老公的妹妹穿的比我還像新娘。我一直安慰自己粘舟,他們只是感情好熔脂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著柑肴,像睡著了一般霞揉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晰骑,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天适秩,我揣著相機(jī)與錄音,去河邊找鬼硕舆。 笑死秽荞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抚官。 我是一名探鬼主播扬跋,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凌节!你這毒婦竟也來(lái)了钦听?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤倍奢,失蹤者是張志新(化名)和其女友劉穎彪见,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體娱挨,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年捕犬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跷坝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酵镜。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柴钻,靈堂內(nèi)的尸體忽然破棺而出淮韭,到底是詐尸還是另有隱情,我是刑警寧澤贴届,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布靠粪,位于F島的核電站,受9級(jí)特大地震影響毫蚓,放射性物質(zhì)發(fā)生泄漏占键。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一元潘、第九天 我趴在偏房一處隱蔽的房頂上張望畔乙。 院中可真熱鬧,春花似錦翩概、人聲如沸牲距。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牍鞠。三九已至,卻和暖如春评姨,著一層夾襖步出監(jiān)牢的瞬間难述,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工参咙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留龄广,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓蕴侧,卻偏偏與公主長(zhǎng)得像择同,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子净宵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353