最全JavaScript數(shù)組操作方法合集

對于一個數(shù)組
我們通過以下方式去創(chuàng)建和初始化一個數(shù)組

// 第一種方式
let arr = new Array()
// 第二種方式
let arr = new Array(7)
// 第三種方式
let arr = new Array(1, 2, 3, 4, 5, 6, 7)

當(dāng)然,這些并不是最簡便的方式
或許你見過如下這樣去初始化一個數(shù)組

let arr = [ ]

這種方式等價于

let arr = new Array()

它其實是JavaScript的語法糖,簡化了這些繁瑣的操作

在數(shù)組末尾插入(任意數(shù)量的)元素

用法:arr.push()

在數(shù)組開頭插入(任意數(shù)量的)元素

用法:arr.unshift()

在數(shù)組末尾刪除(任意數(shù)量的)元素

用法:arr.pop()

在數(shù)組開頭刪除(任意數(shù)量的)元素

用法:arr.shift()

在任意位置添加或刪除元素

用法:arr.splice(index, quantity, item1, item2, ...item n)
API說明:
index(必選):數(shù)組對應(yīng)的下標(biāo)
quantity(必選):刪除元素的個數(shù)
item1, item2, ...item n(可選):插入的自定義元素

特別說明:
(1)當(dāng)quantity0或者是<0的數(shù),表示不刪除元素
(2)一旦使用item1, item2, ...item n這些參數(shù),必定會在指定index位置插入這些元素

// 刪除元素
示例1:
let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
arr.splice(1, 3)
console.log(arr);  =>   [0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

`示例2:

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
arr.splice(1, 0)
console.log(arr);  =>  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

示例3:

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
arr.splice(1, -3)
console.log(arr);  =>  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

示例4:

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
arr.splice(1, 0, 'a', 'b', 'c' )
console.log(arr);  =>  [0, "a", "b", "c", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

示例5:

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
arr.splice(1, -3, 'a', 'b', 'c' )
console.log(arr);  =>  [0, "a", "b", "c", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

示例6:

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
arr.splice(1, 3, 'a', 'b', 'c')
console.log(arr);  =>  [0, "a", "b", "c", 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

截取數(shù)組內(nèi)元素

用法:arr.slice(start, end)
API說明:
start(必選):start為開始截取的下標(biāo)號
end(可選):end為結(jié)束截取的下標(biāo)號
特別說明:
(1)如果end未被規(guī)定,即沒有選上end參數(shù),從start開始截取到數(shù)組結(jié)尾的所有元素。
(2)下標(biāo)號為-1代表數(shù)組最后一個元素,-2代表數(shù)組倒數(shù)第二個元素
(3)返回一個從[start, end)的新數(shù)組

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
let newArr = arr.slice(12, -8)
console.log(newArr);    
// arr.slice(12, -8)等價于arr.slice(12, 8) [12, 8)為空集,所以newArr輸出為[ ]

創(chuàng)建n維數(shù)組

這里以3維數(shù)組為例

// 創(chuàng)建3維數(shù)組
let arr = []
for (let i = 0; i < 3; i++) {
  arr[i] = []
  for (let j = 0; j < 3; j++) {
    arr[i][j] = []
    for (let z = 0; z < 3; z++) {
      arr[i][j][z] = i + j + z
    }
  }
}
// 遍歷輸出數(shù)組的每一個元素
for (let a = 0; a < arr.length; a++) {
  for (let b = 0; b < arr[a].length; b++) {
    for (let c = 0; c < arr[a][b].length; c++) {
      console.log(arr[a][b][c]);
    }
  }
}

拼接數(shù)組(兩個或多個數(shù)組)

用法:arr1.concat(arr2) or arr1.concat(arr2, arr3, ...arr n)
說明:arr1.concat(arr2)表示在arr1數(shù)組尾部拼接上arr2,以此類推

let arr1 = [1, 2]
let arr2 = [3, 4]
let arr3 = [5, 6]
console.log(arr1.concat(arr2));  =>  [1, 2, 3, 4]
console.log(arr1.concat(arr2, arr3));  =>  [1, 2, 3, 4, 5, 6]

數(shù)組迭代

(1)every 對數(shù)組中的每個元素運行給定函數(shù),如果該函數(shù)對每個元素都返回true,則返回true
(2)some 對數(shù)組中的每個元素運行給定函數(shù),如果任意元素返回true,則返回true
(3)forEach 對數(shù)組中的每個元素運行給定函數(shù),該方法沒有返回值
(4)map 對數(shù)組中的每個元素運行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組
(5)filter 對數(shù)組中的每個元素運行給定函數(shù),返回該函數(shù)會返回true的元素組成的數(shù)組

說明:
(1)everysome是兩個相對的方法, every是數(shù)組內(nèi)所有元素均返回true才返回true,some是數(shù)組內(nèi)有一個元素返回true就返回true
(2)filter方法不會改變原數(shù)組,可以理解成過濾/篩選原數(shù)組內(nèi)的部分元素,這些元素組成新的數(shù)組
(3)map方法與filter方法相似,但最大的區(qū)別就是可以對原數(shù)組的進行加工

let arr1 = [1, 2]
// 使用filter
let newArr1 = arr1.filter(item => {
  console.log(item);  =>  1, 2
  if (item > 1) {
    console.log(item);  =>  2
    // return item +1  // 即使這樣寫,返回的數(shù)組元素的值也不會被修改
    return item
  }
})
console.log(newArr1)  =>  [2]

// 使用map(這樣實現(xiàn)其實并不好,因為對于不滿足條件的值會置為undefined,這里只是為了演示使用)
let newArr2 = arr1.filter(item => {
  console.log(item);  =>  1, 2
  if (item > 1) {
    console.log(item);  =>  2
    return item + 1
  }
})
console.log(newArr2)  =>  [undefined, 3]

// 使用map(修改后)
let newArr3 = arr1.filter(item => {
  console.log(item);  =>  1, 2
  if (item > 1) {
    console.log(item);  =>  2
    return item + 1
  } else return item - 1
})
console.log(newArr3)  =>  [0, 3]

reduce迭代方法

用法:

arr.reduce((previousValue, currentValue, index, array)  =>  {
  console.log(previousValue, currentValue, index, array);
})

API說明:
previousValue(必選):前驅(qū)值
currentValue(必選):當(dāng)前值
index(可選):當(dāng)前索引
array(可選):迭代的數(shù)組(是一個固定值,如arr.reduce(),array指代arr)

特別說明:
reduce()方法可以有很多用途:比如:迭代比較數(shù)組中的最大值,求和,數(shù)組去重等等

查找數(shù)組中的元素

(1)indexOf() 返回第一個與給定參數(shù)相等的數(shù)組元素的索引,沒有找到則返回-1
(2)lastIndexOf()indexOf相對返回最后一個與給定參數(shù)相等的數(shù)組元素的索引,沒有找到返回-1
(3)includes() 找到返回true,否則為false
(4)find()接收一個回調(diào)函數(shù),返回第一個滿足條件的值,找不到返回undefined
(5)findIndex()接收一個回調(diào)函數(shù),返回第一個滿足條件的值的索引,找不到返回-1

數(shù)組轉(zhuǎn)換成字符串

用法:arr.toString()

let arr =  [1, 2, 3, 4, 5, 6]
console.log(arr.toString())  =>  1,2,3,4,5,6

數(shù)組拼接成字符串

用法:arr.join(separator)
API說明:
separator(可選):如果該參數(shù)沒選上,默認(rèn)以","作為分隔符;選上,則自定義分隔符

與該方法相對的是split()方法,他是將字符串分隔成數(shù)組
用法:str.split(separator, quantity)
API說明:
separator(必選):字符串或正則表達式
quantity(可選):該參數(shù)指定返回的數(shù)組的最大長度,且返回的子串不會多于這個參數(shù)指定的數(shù)組

顛倒數(shù)組中元素的順序

用法:arr.reverse()

let arr = [1, 2, 3, 4, 5, 6]
console.log(arr.reverse())  =>  [6, 5, 4, 3, 2, 1]

把數(shù)組的元素轉(zhuǎn)換成鍵(下標(biāo))值(下標(biāo)對應(yīng)的值)對

用法:arr.entries()
說明:返回數(shù)組中的迭代對象,該對象包含該數(shù)組的所有鍵值對

let arr = [1, 2, 3, 4, 5, 6]
//  這里可以看出arr.entries()返回的是數(shù)組的一個迭代對象
console.log(arr.entries());  =>  Array Iterator {}
//  既然是迭代對象,我們就需要迭代輸出
//  entries()轉(zhuǎn)換成鍵值對
for (const item of arr.entries()) {
  console.log(item);
  //  [0, 1]
  //  [1, 2]
  //  [2, 3]
  //  [3, 4]
  //  [4, 5]
  //  [5, 6]
}
//  keys()轉(zhuǎn)換成鍵
for (const item of arr.keys()) {
  console.log(item);
  //  0
  //  1
  //  2
  //  3
  //  4
  //  5
}
for (const item of arr.values()) {
  console.log(item);
  //  1
  //  2
  //  3
  //  4
  //  5
  //  6
}

根據(jù)已有數(shù)組淺拷貝一個新數(shù)組

用法:Array.from(arr,mapFunction)
API說明:
arr(必選):已有的數(shù)組,需要被淺拷貝的數(shù)組
mapFunction(可選):這里可以傳進來一個過濾值的函數(shù)
thisValue(可選):映射函數(shù)mapFunction中的 this 對象
說明:Array.from(arr)從一個類似數(shù)組或可迭代對象中創(chuàng)建一個新的,淺拷貝的數(shù)組實例

let arr = [1, 2, 3, 4, 5, 6]
let fromArr = Array.from(arr)
console.log(arr, fromArr);  =>  [1, 2, 3, 4, 5, 6]  [1, 2, 3, 4, 5, 6]
arr[2] = 10
console.log(arr, fromArr);  =>  [1, 2, 10, 4, 5, 6]  [1, 2, 10, 4, 5, 6]
//  這樣似乎是深拷貝對的,沒錯,這個假象,這只是對于第一層的數(shù)組是深拷貝
//  那如果像如下這樣兩層數(shù)組的呢?
let arr = [1, 2, [7, 8], 4, 5, 6]
let fromArr = Array.from(arr)
console.log(arr, fromArr);  =>  [1, 2, [7, 8], 4, 5, 6]  [1, 2, [7, 8], 4, 5, 6]
arr[2][0] = 10
console.log(arr, fromArr);  =>  [1, 2, [10, 8], 4, 5, 6]  [1, 2, [10, 8], 4, 5, 6]

或者有其他用法:

console.log(Array.from('foo'));  =>  ["f", "o", "o"]
console.log(Array.from([1, 2, 3], x => 2x));  =>  [2, 4, 6]

根據(jù)傳入的參數(shù)創(chuàng)建新數(shù)組

用法:Array.of(params)

根據(jù)自定義參數(shù)創(chuàng)建數(shù)組

let arr = Array.of(1, 2, 3, 4, 5, 6)  //  等價于let arr = [1, 2, 3, 4, 5, 6]

根據(jù)已有數(shù)組創(chuàng)建新數(shù)組

let arr = [1, 2, 3, 4, 5, 6]
let ofArr = Array.of(...arr)  //  展開運算
console.log(ofArr)  =>  [1, 2, 3, 4, 5, 6]

填充數(shù)組

用法:arr.fill(filledValue, start, end)
API說明:
filledValue(必選):要填充的值
start(可選):開始填充的索引位置(開區(qū)間)
end(可選):結(jié)束填充的索引位置,但不包括該位置(閉區(qū)間);如果沒選上該參數(shù),默認(rèn)結(jié)束位置為arr.length
特別說明:假如選上了startend兩個參數(shù),范圍為[start, end);假如選上了start參數(shù)沒選上end參數(shù),范圍為[start, arr.length]
我們也可以這樣初始化一個數(shù)組

let initArr = Array(6).fill(1)
console.log(initArr)  =>  [1, 1, 1, 1, 1, 1]

對于一個已有數(shù)組,我們也可以填充覆蓋原來的數(shù)組元素

let arr = [1, 2, 3, 4, 5, 6]
arr.fill(8, 3, 5)
console.log(arr)  =>  [1, 2, 3, 8, 8, 6]

賦值數(shù)組的一系列元素到統(tǒng)一數(shù)組的指定位置

用法:arr.copyWithin(target, start, end)
API說明:
target(必選):復(fù)制到的目標(biāo)索引位置
start(可選):開始復(fù)制的索引位置(閉區(qū)間)
end(可選):結(jié)束復(fù)制的索引位置,默認(rèn)為arr.length(開區(qū)間)
特別說明:假如選上了startend兩個參數(shù),范圍為[start, end);假如選上了start參數(shù)沒選上end參數(shù),范圍為[start, arr.length]

let arr = [1, 2, 3, 4, 5, 6]
arr.copyWithin(1, 2, 5)
console.log(arr);  =>  [1, 3, 4, 5, 5, 6]

按字母表排序

用法:arr.sort(sortby(a, b))
API說明:
sortby(可選):自定義排序,這里必須是函數(shù),a是兩個進行比較的值的后者,b是前者,如果a<b,則證明a排在b前面,返回一個<0的值;如果a>b,則a排在b后面,返回一個>0的值;如果a=b,則返回0
特別說明:
如果調(diào)用該方法沒有使用參數(shù),將按字母順序?qū)?shù)組中的元素進行排序,說的更精確點,是按照ASCII碼的順序進行排序

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
arr.sort()
console.log(arr)  =>  [1, 10, 2, 3, 4, 5, 6, 7, 8, 9]

這樣或許并不是我們想要的對吧
這是因為在對數(shù)組做排序時,把元素默認(rèn)成字符串進行相互比較
我們可以進行如下改進,就可以對數(shù)字進行排序了

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 10, 9]
arr.sort((a, b) => {
  if (a < b) {
    return -1
  } else if (a > b) {
    return 1
  } else return 0
})
console.log(arr)  =>  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

上面是對數(shù)字進行排序,那如何對字符串進行排序呢
假如有這樣一個數(shù)組

let names = [ 'ThinkBig', 'thinkbig', 'jazzy', 'Jazzy']
console.log(names.sort())  =>  ["Jazzy", "ThinkBig", "jazzy", "thinkbig"]

這是因為對于ASCII碼,J < T < j < t然而這也不是我們想要的
我們可以這樣寫一個比較函數(shù)
忽略大小寫排序

let names = ['ThinkBig', 'thinkbig', 'jazzy', 'Jazzy']
names.sort((a, b) => {
  if (a.toLowerCase() < b.toLowerCase()) {
    return -1
  }
  if (a.toLowerCase() > b.toLowerCase()) {
    return 1
  }
  return 0
})
console.log(names);  =>  ["jazzy", "Jazzy", "ThinkBig", "thinkbig"]

小寫排在大寫前面

let names = ['ThinkBig', 'thinkbig', 'jazzy', 'Jazzy']
names.sort((a, b) => a.localeCompare(b))
console.log(names);  =>  ["jazzy", "Jazzy", "thinkbig", "ThinkBig"]

類型數(shù)組

因為JavaScript數(shù)組不是強類型的,因此它可以存儲任意類型的數(shù)據(jù),而類型數(shù)組則用于存儲單一類型的數(shù)據(jù)
(1)Int8Array 8位二進制補碼整數(shù)
(2)Uint8Array 8位無符號整數(shù)
(3)Uint8ClampedArray 8位無符號整數(shù)
(4)Int16Array 16位二進制補碼整數(shù)
(5)Uint16Array 16位無符號整數(shù)
(6)Int32Array 32位二進制補碼整數(shù)
(7)Uint32Array 32位無符號整數(shù)
(8)Float32Array 32位IEEE浮點數(shù)
(9)Float64Array 64位IEEE浮點數(shù)

我們可以通過以下語句去初始化這樣一個類型數(shù)組

let arr = new Int8Array(length)

Int8Array可以根據(jù)實際需求替換

該文章已經(jīng)上傳至github,有需要的童鞋可以進行查閱或下載,歡迎star
https://github.com/jazzyXie/JS_Array_Operation_Methods

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

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