對于一個數(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)quantity為0或者是<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)every和some是兩個相對的方法, 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
特別說明:假如選上了start和end兩個參數(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ū)間)
特別說明:假如選上了start和end兩個參數(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