JS陣列API總結

derek_skx發表於2019-03-20

js中陣列API詳解

陣列在平時的開發過程使用頻率非常高,熟練掌握陣列的各種api用法很有必要,在此對資料的所有api做一次詳細介紹

陣列提供的api主要分為 建構函式自身方法,改變自身、不改變自身、遍歷陣列四類

ES2019新增方法

  • flat
    • 作用:陣列降維,返回一個新陣列,不改變原來陣列
    • 接受引數:Number型別,預設為1,根據引數來降低維度層次
      const arr = [2,3,[4],[5,[6,[7]]]]
      arr.flat(1)   //=>[2,3,4,5,[6,[7]]]
      arr.flat(2)   // => [2,3,4,5,6,[7]]
      arr.flat(Infinity)   //=>[2,3,4,5,6,7]
      console.log(arr)  // [2,3,[4],[5,[6,[7]]]]
    複製程式碼
  • flatMap
    • 作用:對資料進行統一變化處理,返回一個新陣列,不改變原陣列
    • 接受引數:func
      const arr = [1,2,3]
      //對每一個元素做處理
      arr.flatMap(x => x*2)  // [2,4,6]
      //對一個元素多處理,返回多個對應的值,但是返回必須是陣列,裡面的型別不限制
      arr.flatMap(x => [x,x*2]   // [1,2,2,4,3,6]
      arr.flatMap(x=>[{test:x}]  // [{test:1},{test:2},{test;3}]
      //如果返回{}會全部返回undefined
      arr.flatMap(x => {x:x})   // [undefined,undefined,undefined]
    複製程式碼

Array建構函式的方法

  • of

    Array.of():將引數依次轉化為陣列中的一項,然後返回這個新陣列,功能和Array()基本一致(傳單個數字除外)

      Array.of(12,'dere',18) // => [12,'derek',18]
      Array.of(8.0) // => [8]
      Array(8.0)   // => [undefined * 8]
    複製程式碼
  • from

    Array.from():將一個類陣列物件轉化為一個陣列,返回新陣列,不改變原物件

    • 語法:Array.from(obj,fn,thisArg)
    • obj: 需要轉為陣列的物件
    • fn: 對物件進行加工的方法
    • thisArg: this作用域
    • 注意: 物件的key只能是數字,且不能超過length的長度,先返回滿足條件的key值
      // 物件的key是數字,正常轉化
      let obj = {0: 'derek', 1: 18, 2: 'M', length: 3 }
      let arr = Array.from(obj,(val,index)=>{
        val
        index
        return val
      },obj)
      arr // => ['derek',18,'M']
    
      // 物件的key值不是數字的返回undefined
      let obj = {name: 'derek', 1: 18, 0: 'M', length: 3 }
      let arr = Array.from(obj,(val,index)=>{
        val
        index
        return val
      },obj)
      arr // => ['M',18,undefined]
    複製程式碼
  • isArray

    Array.isArray(): 判斷一個變數是否是一個陣列 語法:Array.isArray(arr)

      let arr = [1,2,3]
      let a = Array.isArray(arr)
      a// => true
    複製程式碼

改變自身的api

  • push

    push(): 在目標陣列的尾部壓入一個元素,並且返回這個元素最新的length

      let arr = ['a','b','c']
      let len = arr.push('d')
      console.log(arr,len) // => ['a','b','c','d']  4
    複製程式碼
  • unshift

    unshift(): 在目標陣列的頂部壓入一個元素,並且返回這個元素的length

      let arr = ['a','b','c']
      let len = arr.unshift('d')
      console.log(arr,len) // => ['d','a','b','c']  4
    複製程式碼
  • pop

    pop(): 在目標陣列的尾部壓出一個元素,並且返回這個被壓出元素

      let arr = ['a','b','c','d']
      let a = arr.pop()
      console.log(arr,a) // => ['a','b','c']  'd'
    複製程式碼
  • shift

    shift(): 在目標陣列的頂部壓出一個元素,並且返回這個被壓出元素

      let arr = ['a','b','c','d']
      let a = arr.shift()
      console.log(arr,a) // => ['b','c','d']  'a'
    複製程式碼
  • reverse

    reverse(): 將陣列順序進行顛倒,第一個成為最後一個,最後一個成為第一個,返回當前陣列

      let arr = ['a','b','c','d']
      let arr2 = arr.reverse()
      console.log(arr) // => ['d','c','b','a']
      console.log(arr2) // => ['d','c','b','a']
      console.log(arr2===arr) // => true
    複製程式碼
  • sort

    sort(): 將陣列順序進行快速排序,返回當前陣列

    • a:預設排序:不傳引數(arr.sort()),陣列元素將按照各自轉換為字串的Unicode(萬國碼)位點順序排序
    • b:自定義排序:傳入自己想要的排序方法(arr.sort((a,b) => a-b)),會按照順“從小到大”的順序排序
      // 對數字陣列進行排序
      let aaa = [3,4,52,64,234,6,8]
      let arr = aaa.sort()
      let arr1 = aaa.sort((a,b)=> a-b)
      console.log(arr) // => [234,3,4,52,6,64,8]
      console.log(arr1) // => [3,4,6,8,52,64,234]
      -------------------------------------
      // 對元素是物件的陣列進行快速排序
      let arr = [{name: 'derek',age: 18 },{ name: 'tom', age: 28 },{ name: 'lily', age: 18 },{ name:  'lucy', age: 22 }]
      let aa = arr.sort((a,b)=> a.age-b.age)
      console.log(aa) // => [{name:'derek',age:18},{ name: 'lily', age: 18 },{ name:  'lucy', age: 22 },{ name: 'tom', age: 28 }]
    複製程式碼

    注意:

    • 使用sort()進行陣列排序時,陣列元素少於10個時,用的是插入排序法,排序穩定
    • 陣列元素大於10個時,用的是快速排序,排序不穩定,排序可能會出錯
    • 解決方案: array.sort((a,b)=> a - b || array.indexof(a)-array.indexof(b))
  • splice

    splice(): 可以對陣列進行插入,刪除,替換的操作,返回一個包含刪除的元素的陣列 語法:arr.splice(start,count,item1,item2) start: 開始刪除的位置,從0開始,如果大於陣列的長度則為arr.length count: 刪除元素的數量,為0時,如果存在第三個元素,就是陣列插入元素 item1、item2:往陣列中新增的元素

      //刪除元素
      let arr = ['tom','derek','lily','lucy']
      let a = arr.splice(0,2) 
      console.log(arr)  // => ['lily','lucy']
      console.log(a)  // => ['tom','derek']
      //替換元素
      let arr = ['tom','derek','lily','lucy']
      let b = arr.splice(1,2,'david')
      console.log(arr)  //=> ['david','lily','lucy']
      console.log(b)   // => ['tom','derek']
      //插入元素
      let arr = ['tom','derek','lily','lucy']
      let c = arr.splice(2,0,'nina')
      console.log(arr)  // => ['tom','derek','nina','lily','lucy']
      console.log(c)   // => []
    複製程式碼

    注意:當刪除開始資料大於陣列長度時,預設為陣列尾部壓入元素

      let arr = ['tom','derek','lily','lucy']
      let b = arr.splice(5,2,'david')
      console.log(arr)  //=> ['tom','derek','lily','lucy','david']
      console.log(b)   // => []
    複製程式碼
  • copyWithin

    copyWithin(): 陣列內的元素替換,就是替換元素和被替換元素都時陣列內的元素,返回改變後的陣列

    • 語法: array.copywithin(target,start,end)
    • target: 被替換元素的開始下標
    • start:替換元素的開始下標,可以為負數
    • end:替換元素的結束下標,不填預設為array.length,可以為負數
      let arr = [1,2,3,4,5]
      let result = arr.copyWithin(0,2,3)
      console.log(result === arr,arr)  // => true  [3,2,3,4,5]
    
      let arr = [1,2,3,4,5]
      arr.copyWithin(1,3)
      console.log(arr)  // =>[1,4,5,4,5]
    
      let arr = [1,2,3,4,5]
      arr.copyWithin(1,-2,-1)
      console.log(arr)  // =>[1,4,3,4,5]
    複製程式碼
  • fill

    fill(): 用於對陣列中的指定位置區間的元素替換為指定的值,返回改變後的原陣列

    • 語法:array.fill(val,start,end)
    • val: 指定替換的值
    • start: 被替換的開始下標,可以為負數
    • end: 被替換的結束下標,可以為負數,不填為陣列長度
      let arr = [1,2,3,4,5]
      const a = arr.fill(6,1,3)
      console.log(a===arr,arr) // => true [1,6,6,4,5]
    
      let arr = [1,2,3,4,5]
      const a = arr.fill(6,-3,-1)
      console.log(arr) // =>  [1,2,6,6,5]
    複製程式碼

不改變自身的api

  • concat

    concat(): 將傳入的陣列或者元素合併,組成一個新陣列返回

    • 語法:arr.concat(val1,val2...)
    • 注意:引數可以是陣列時,只能降一個緯度合併
      let arr = [1,2,3]
      let aaa = arr.concat(1,2,[3,4,5],[6])
      console.log(aaa,arr) // => [1,2,3,4,5,6,7] [1,2,3]
    
      let bbb =arr.concat(1,[2,3,[4,5,6]])
      console.log(bbb)  // => [1,2,3,[4,5,6]]
    複製程式碼
  • join

    join(): 將陣列中的元素以自定義的一個連結符拼接為一個字串,並返回

    • 語法:array.join(val)
    • val: 元素之間的連結符,預設為','
      let arr = [1,2,3,4]
      arr.join()  // => 1,2,3,4
      arr.join('-')  // => 1-2-3-4
    複製程式碼
  • slice

    slice(): 將陣列中的部分資料複製到一個新陣列中,並返回這個陣列

    • 語法: array.slice(start,end)
    • start: 複製陣列的開始下標,可以為負數(-2 => array.length-2
    • end: 複製陣列的結束下標,不包含該元素,不傳預設為到最後一個元素
    • 注意:不傳任何引數是,可以做淺拷貝slice()
      let arr = [1,2,3,4,5,6]
      arr.slice(1,4) // => [2,3,4]
      arr.slice(2) // => [3,4,5,6]
      arr.slice(-3,5) // => [4,5,6]
    複製程式碼
  • toString

    toString(): 返回陣列的字串形式,等效於join()

    • 語法:array.toString()
    • 注意:陣列和字串元素進行+拼接時,會自動呼叫toString方法
      let array = ['a','b','c','d']
      array.toString()  // => a,b,c,d
      array+'e' // => a,b,c,de
    複製程式碼
  • toLocalString

    toLocalString(): 類似toString()的變型,該字串由陣列中的每個元素的 toLocaleString() 返回值經呼叫 join() 方法連線(由逗號隔開)組成

    • 語法:array.toLocalString()
    • 注意:陣列中的各個元素將呼叫各自的toLocalString方法
      • Object:Object.prototype.toLocaleString()
      • Number:Number.prototype.toLocaleString()
      • Date:Date.prototype.toLocaleString()
      let arr = [{name: 'derek'},22,'M',new Date()]
      arr.toLocalString() // => '[object,object],22,M,2019/3/5 1:06:23PM'
    複製程式碼
  • indexOf

    indexOf(): 用於查詢陣列中元素出現的第一次索引位置,並返回,沒有則返回-1

    • 語法: array.indexOf(el,start)
    • el: 查詢的目標元素
    • start: 開始查詢的下標位置
    • 注意:
      • start不傳,預設為0
      • start > array.length,則返回-1
      • start < 0 ,從array.length + start 的位置開始
      • start + array.length < 0,會查到整個陣列
      let arr = [1,3,4,5,7,9,0,7,45,6,8]
      let a =arr.indexOf(1) // => 0
      let b = arr.indexOf(1,3) // => -1
      let c = arr.indexOf(7,-5) // => 7
      let d = arr.indexOf(7, -10) // => 4
    複製程式碼
  • lastIndexOf

    lastIndexOf(): 元素在陣列中最後出現的下標,沒有則返回-1

    • 語法: array.lastIndexOf(el,start)
    • el: 查詢的目標元素
    • start: 開始查詢的下標位置
    • 例項: 參考indexOf
  • includes

    includes(): 判斷陣列中是否存在某個元素,存在返回true,不存在則返回false

    • 語法: array.includes(el,start)
    • el: 要查詢的目標元素
    • start: 開始查詢的下標,預設為0
      var array = [1, 2, NaN];
      array.includes(1) // true
      array.includes(NaN) // true
      array.includes(2,-4) // true
    複製程式碼

用於陣列遍歷的api

  • forEach

    forEach(): 指定陣列中的每個元素都執行一次傳入的函式,返回undefinded

    • 語法: arr.forEach(fn,thisArg)
    • fn: 每個元素需要執行的方法,接受三個引數 fn(el,index,array)
    • el: 當前處理的元素
    • index: 正在處理元素的下標
    • array: 陣列本身,一般不寫
    • thisArg: fn函式內的this物件
    • 注意: 將為陣列中每一項執行一次 fn 函式,那些已刪除,新增或者從未賦值的項將被跳過(但不包括值為 undefined 的項)
      let arr = [1,2,3,4,5]
      let a = arr.forEach((el,index)=> {
        arr[index] = el * index
      })
      console.log(a)  // => undefined
      console.log(arr) // => [0,2,6,12,20]
    複製程式碼
  • map

    map(): 使用傳入的函式處理陣列中的每個函式,並且將每個返回值組成新陣列並返回

    • 語法: arr.map(fn,thisArg)
    • fn: 每個陣列元素執行的方法
    • el: 當前處理的元素
    • index: 正在處理元素的下標
    • array: 陣列本身,一般不寫
    • thisArg: fn函式內的thisArg,一般不傳
      let arr = [1,2,3,4]
      let result = arr.map((item,index) => item * index )
      console.log(result)  // => [0,2,6,12]
      console.log(arr)  // => [1,2,3,4]
    複製程式碼
  • filter

    filter(): 對陣列中的每個元素呼叫傳入的函式,將滿足條件的元素組成一個新陣列並返回

    • 語法: arr.filter(fn)
    • fn: 判斷元素是否滿足目標元素的條件函式
      let arr = [1,2,3,4,5,6,7]
      arr.filter(item=>item> 3) //=> [4,5,6,7]
      arr.filter(item=>item>8)  // => []
      arr.filter(item => item % 2 === 0) // => [2,4,6,8]
    複製程式碼
  • reduce

    reduce(): 方法接收一個方法作為累加器,陣列中的每個值(從左至右) 開始合併,最終為一個值

    • 語法: arr.reduce(fn,initVal)
    • fn: 表示在陣列中每個元素執行的函式,接收4個引數
      • previousValue 上一次呼叫回撥返回的值,或者是提供的初始值
      • value 陣列中當前被處理元素的值
      • index 當前元素在陣列中的索引
      • array 陣列自身
      • initVal: 累加初始值
      • 注意: 當 fn 第一次執行時
        • 如果 initialValue 存在,那麼第一個 previousValue = initialValue, item = 陣列中的第一個值;
        • 如果 initialValue 不存在,那麼 previousVaule = 陣列中的第一個值,item =陣列中的第二個值。此時如果陣列為空,那麼將丟擲 TypeError。
        • 如果陣列僅有一個元素, 但陣列為空,那麼fn不會被執行,陣列的唯一值將被返回
      //用於求和
      let arr = [1,2,3,4,5]
      arr.reduce((prev,value)=>value * prev,0) // => 120
      //用於其他應用
      let arr = [1,2,3,4,5]
      let result = arr.reduce = ((prev,value,index) => {
        value > 2 ? prev.push(value)
        return prev
      },[])
      console.log(result) // => [3,4,5]
    複製程式碼
  • reduceRight

    reduceRight():方法接收一個方法作為累加器,陣列中的每個值(從右至左) 開始合併,最終為一個值

    • 語法: arr.reduce(fn,initVal)
    • fn: 表示在陣列中每個元素執行的函式,接收4個引數
    • 具體用法參考上述的reduce函式
  • some

    some(): 對比陣列中的所有元素,只要有滿足條件的就返回true,並結束迴圈,全部不滿足就返回false

    • 語法: arr.some(fn)
    • fn: 每個元素執行的方法
      let arr = [1,2,3,4,5,6]
      arr.some(item => item = 3) // => true
      arr.some(item => item > 8)  // => false
    複製程式碼
  • every

    every(): 對比陣列中的所有元素,全部滿足條件則返回true,只要有一個不滿足就返回false

    • 語法:arr.every(fn)
    • fn: 每個元素執行的方法
      let arr =[1,2,3,4,5]
      arr.every(item => item > 0) // => true
      arr.every(item => item > 2)  // => false
    複製程式碼
  • find

    find(): 返回陣列中第一個滿足條件的元素(如果有的話), 如果沒有,則返回undefined

    • 語法: array.find(fn,thisArg)
    • fn: 查詢條件函式
    • thisArg: fn函式內部執行的this物件,一般不傳
      let arr = [1,2,3,4,5,6]
      arr.find(item => item>3) // => 4
      arr.find(item => item < 1) // => undefined
    複製程式碼
  • findIndex

    findIndex(): 返回陣列中第一個滿足條件的元素的索引(如果有的話), 如果沒有,則返回-1

    • 語法: array.findIndex(fn,thisArg)
    • fn: 條件函式
    • thisArg: fn函式內部執行的this物件,一般不傳
      let arr = [1,2,3,4,5]
      arr.findIndex(item => item > 3) // => 3
      arr.findIndex(item => item < 0) // => -1
    複製程式碼
  • keys

    keys(): 返回陣列索引的迭代器

    • 語法: array.keys()
      let arr = ['a','b','c']
      let aa = arr.keys()
      console.log(aa.next())  // => Object {value: 0, done: false}
      console.log(aa.next())  // => Object {value: 1, done: false}
      console.log(aa.next())  // => Object {value: 2, done: false}
      console.log(aa.next())  // => Object {value: undefined, done: true}
      // 注意:用於物件的keys
      let obj = {name: 'derek',age:18}
      Object.keys(obj)  // => ['name','age']
    複製程式碼
  • values

    values(): 返回陣列值的迭代器

    • 語法: array.values()
      let arr = ['a','b','c']
      let aa = arr.values()
      console.log(aa.next())  // => Object {value: 'a', done: false}
      console.log(aa.next())  // => Object {value: 'b', done: false}
      console.log(aa.next())  // => Object {value: 'c', done: false}
      console.log(aa.next())  // => Object {value: undefined, done: true}
      // 注意:用於物件的values
      let obj = {name: 'derek',age:18}
      Object.values(obj)  // => ['derek',18]
    複製程式碼
  • entries

    entries(): 返回一個陣列迭代器物件,該物件包含陣列中每個索引的鍵值對

    • 語法: array.entries()
      let arr = ['derek','tom']
      let aa = arr.entries()
      console.log(aa.next())  // => {value:[0:'derek],done: false}
      console.log(aa.next())  // => {value:[1:'tom],done: false}
      console.log(aa.next())  // => {value:undefined,done: true}
      // 物件中用entries
      let obj = {name: 'derek',age:18}
      console.log(Object.entries(obj)) // => [[name:'derek'],[age:18]]
    複製程式碼

相關文章