Array.prototype.pop()
pop()
方法從數(shù)組中刪除最后一個(gè)元素并返回該元素。此方法更改數(shù)組的長(zhǎng)度辫封。
const plants = ['broccoli', 'cauliflower', 'cabbage', 'kale', 'tomato'];
plants.pop() // "tomato"
console.log(plants) // ["broccoli", "cauliflower", "cabbage", "kale"]
plants.pop()
console.log(plants) // ["broccoli", "cauliflower", "cabbage"]
對(duì)空數(shù)組使用 pop
方法悴灵,不會(huì)報(bào)錯(cuò)晤柄,而是返回undefined
。
[].pop() // undefined
注意:該方法會(huì)改變?cè)瓟?shù)組呼寸。
Array.prototype.push()
push()
方法將一個(gè)或多個(gè)元素添加到數(shù)組的末尾,并返回?cái)?shù)組的新長(zhǎng)度。
const animals = ['pigs', 'goats', 'sheep']
animals.push('cows') // 4
console.log(animals) // ["pigs", "goats", "sheep", "cows"]
animals.push('chickens') // 5
console.log(animals) // ["pigs", "goats", "sheep", "cows", "chickens"]
注意:該方法會(huì)改變?cè)瓟?shù)組恭陡。
Array.prototype.shift()
shift()
方法從數(shù)組中刪除第一個(gè)元素并返回該元素。此方法更改數(shù)組的長(zhǎng)度干跛。
const arr = [1, 2, 3]
const firstElement = arr.shift()
console.log(arr) // [2, 3]
console.log(firstElement) // 1
遍歷并清空一個(gè)數(shù)組
const arr = [1, 2, 3]
let item
while (item = list.shift()) {
console.log(item)
}
list // []
上面代碼通過(guò) list.shift()
方法每次取出一個(gè)元素子姜,從而遍歷數(shù)組。它的前提是數(shù)組元素不能是 0
或任何布爾值等于 false
的元素,因此這樣的遍歷不是很可靠哥捕。
注意:該方法會(huì)改變?cè)瓟?shù)組牧抽。
Array.prototype.unshift()
unshift()
方法將一個(gè)或多個(gè)元素添加到數(shù)組的開(kāi)頭,并返回?cái)?shù)組的新長(zhǎng)度遥赚。
const arr = [1, 2, 3]
console.log(arr.unshift(4, 5)) // 5
console.log(arr) // [4, 5, 1, 2, 3]
注意:該方法會(huì)改變?cè)瓟?shù)組扬舒。
Array.prototype.join()
join()
方法以指定參數(shù)作為分隔符,將數(shù)組的所有元素連接為一個(gè)字符串返回凫佛。如果不提供參數(shù)讲坎,默認(rèn)用逗號(hào)分隔。
const arr = ['Fire', 'Air', 'Water']
console.log(arr.join()) // "Fire,Air,Water"
console.log(arr.join(' ')) // "Fire Air Water"
console.log(arr.join('-')) // "Fire-Air-Water"
如果數(shù)組成員是 undefined
或 null
或空位愧薛,會(huì)被轉(zhuǎn)成空字符串晨炕。
[undefined, null].join('#') // '#'
['a',, 'b'].join('-') // 'a--b'
通過(guò) call
方法,join
方法也可以用于字符串或類數(shù)組的對(duì)象毫炉。
Array.prototype.join.call('hello', '-') // "h-e-l-l-o"
const obj = { 0: 'a', 1: 'b', length: 2 }
Array.prototype.join.call(obj, '-') // 'a-b'
示例:重復(fù)字符串
使用 join
方法來(lái)重復(fù)字符串瓮栗。
Array(4).join('LOVE') // 'LOVELOVELOVE'
Array.prototype.concat()
concat()
方法用于合并兩個(gè)或多個(gè)數(shù)組。此方法不會(huì)更改現(xiàn)有數(shù)組瞄勾,而是返回一個(gè)新數(shù)組费奸。
const arr1 = ['a', 'b', 'c']
const arr2 = ['d', 'e', 'f']
console.log(arr1.concat(arr2)) // ["a", "b", "c", "d", "e", "f"]
除了數(shù)組作為參數(shù),concat
也接受其他類型的值作為參數(shù)进陡,添加到目標(biāo)數(shù)組尾部愿阐。
const arr = []
arr.concat(1, '1', true, {}, null, undefined) // [1, '1', true, {…}, null, undefined]
如果數(shù)組成員包括對(duì)象,concat
方法返回當(dāng)前數(shù)組的一個(gè)淺拷貝趾疚。所謂“淺拷貝”缨历,指的是新數(shù)組拷貝的是對(duì)象的引用。
Array.prototype.isArray()
isArray()
方法確定傳遞的值是否為數(shù)組盗蟆。
Array.isArray([1, 2, 3]) // true
Array.isArray({ foo: 123 }) // false
Array.isArray('foobar') // false
Array.isArray(undefined) // false
Array.prototype.reverse()
reverse()
反轉(zhuǎn)數(shù)組的元素順序戈二。第一個(gè)數(shù)組元素變?yōu)樽詈笠粋€(gè),最后一個(gè)數(shù)組元素變?yōu)榈谝粋€(gè)喳资。
const arr = ['one', 'two', 'three']
console.log(arr) // ['one', 'two', 'three']
const reversed = arr.reverse()
console.log(reversed) // ['three', 'two', 'one']
console.log(arr) // ['three', 'two', 'one']
注意:該方法會(huì)改變?cè)瓟?shù)組觉吭。
Array.prototype.slice()
slice()
方法選取數(shù)組的一部分,并返回一個(gè)新數(shù)組仆邓。原始數(shù)組不會(huì)被修改鲜滩。
const animals = ['ant', 'bison', 'camel', 'duck', 'elephant']
console.log(animals.slice(2)) // ["camel", "duck", "elephant"]
console.log(animals.slice(2, 4)) // ["camel", "duck"]
console.log(animals.slice(1, 5)) // ["bison", "camel", "duck", "elephant"]
如果 slice
方法的參數(shù)是負(fù)數(shù),則表示倒數(shù)計(jì)算的位置节值。
animals.slice(-2) // ['duck', 'elephant']
animals.slice(-2, -1) // ['duck']
slice
方法的一個(gè)重要應(yīng)用徙硅,是將類數(shù)組的對(duì)象轉(zhuǎn)為真正的數(shù)組。
Array.prototype.slice.call({ 0: "a", 1: "b", length: 2 }) // ['a', 'b']
Array.prototype.splice()
splice()
方法通過(guò)刪除現(xiàn)有元素或添加新元素來(lái)更改數(shù)組的內(nèi)容搞疗。
const months = ['Jan', 'March', 'April', 'June']
months.splice(1, 0, 'Feb')
// 在第 1 個(gè)索引位置插入
console.log(months) // ['Jan', 'Feb', 'March', 'April', 'June']
// 在第 4 個(gè)索引處替換 1 個(gè)元素
months.splice(4, 1, 'May')
console.log(months) // ['Jan', 'Feb', 'March', 'April', 'May']
注意:該方法會(huì)改變?cè)瓟?shù)組嗓蘑。
Array.prototype.indexOf()
indexOf()
方法返回?cái)?shù)組中可以找到給定元素的第一個(gè)索引,如果該元素不存在,則返回 -1桩皿。
const beasts = ['ant', 'bison', 'camel', 'duck', 'bison']
console.log(beasts.indexOf('bison')) // 1
// 從索引 2 開(kāi)始
console.log(beasts.indexOf('bison', 2)) // 4
console.log(beasts.indexOf('giraffe')) // -1
Array.prototype.lastIndexOf()
lastIndexOf()
方法返回?cái)?shù)組中可以找到給定元素的最后一個(gè)索引豌汇,如果該元素不存在,則返回 -1泄隔。從 fromIndex 開(kāi)始向后搜索數(shù)組拒贱。
const animals = ['Dodo', 'Tiger', 'Penguin', 'Dodo']
console.log(animals.lastIndexOf('Dodo')) // 3
console.log(animals.lastIndexOf('Tiger')) // 1
Array.prototype.includes()
includes()
是 ES7 新增的數(shù)組方法,用于判斷數(shù)組是否包含某個(gè)元素佛嬉,并根據(jù)條件返回 true
或 false
逻澳。
const arr = [10, 11, 3, 20, 5]
const includesTwenty = arr.includes(20)
console.log(includesTwenty) // true
includes
方法還接受一個(gè)可選參數(shù),根據(jù)索引來(lái)指定要從數(shù)組中的哪個(gè)位置開(kāi)始搜索暖呕。默認(rèn)情況下斜做,index
參數(shù)為零。
const arr = [1, 2, 3, 4, 5]
if(arr.includes(3, 2)) {
console.log('item found')
} else {
console.log('item not found')
}
建議:使用
includes
替代indexOf
檢查數(shù)組是否包含某個(gè)元素缰揪。
Array.prototype.reduce()
reduce()
方法根據(jù) reducer 函數(shù)和初始值創(chuàng)建任何類型的輸出值陨享。根據(jù)提供的 reducer 函數(shù)葱淳,結(jié)果可以是任何類型钝腺,例如整數(shù)、對(duì)象或數(shù)組赞厕。
const arr = [1, 2, 3, 4]
const reducer = (acc, cur) => acc + cur
console.log(arr.reduce(reducer)) // 10
console.log(arr.reduce(reducer, 5)) // 15
通過(guò) reducer 函數(shù)僅獲取 name
鍵:
const input = [
{ 'name' : 'O.O', 'age': 18 },
{ 'name' : 'D.O', 'age': 18 },
{ 'name' : 'K.O', 'age': 18 },
{ 'name' : 'O.K', 'age': 18 }
]
const reducer = (acc, cur) => {
acc.push({ 'name': cur.name })
return acc
}
let output = input.reduce(reducer, [])
console.log(output)
注意:
Reduce()
支持所以現(xiàn)代瀏覽器艳狐,以及 IE9 及更高版本,如果想支持低版本瀏覽器皿桑,可以添加一個(gè) polyfill 以支持 IE6毫目。
Array.prototype.reduceRight()
reduceRight()
方法對(duì)累加器應(yīng)用一個(gè)回調(diào)函數(shù),數(shù)組的每個(gè)值(從右到左)都必須將其減少為單個(gè)值诲侮。
const arr = [[0, 1], [2, 3], [4, 5]].reduceRight(
(acc, cur) => acc.concat(cur)
)
console.log(arr) // [4, 5, 2, 3, 0, 1]
Array.prototype.filter()
filter()
方法使用一個(gè)過(guò)濾函數(shù)創(chuàng)建一個(gè)新數(shù)組镀虐,只保留基于該函數(shù)返回 true
的元素。結(jié)果是一個(gè)長(zhǎng)度等于或小于原始數(shù)組長(zhǎng)度的數(shù)組沟绪,包含與原始數(shù)組相同元素的子集刮便。
const array = [10, 11, 3, 20, 5]
const greaterThanTen = array.filter(item => item > 10)
console.log(greaterThanTen) //[11, 20]
示例:過(guò)濾對(duì)象數(shù)組
const countries = [
{ name: 'Nigeria', continent: 'Africa' },
{ name: 'Nepal', continent: 'Asia' },
{ name: 'Angola', continent: 'Africa' },
{ name: 'Greece', continent: 'Europe' },
{ name: 'Kenya', continent: 'Africa' },
{ name: 'Greece', continent: 'Europe' }
]
let asianCountries = countries.filter(country => country.continent === 'Asia')
console.log(asianCountries); // [{name: "Nepal", continent: "Asia"}]
示例:在數(shù)組中搜索特定字母
const names = ['Victoria', 'Pearl', 'Olivia', 'Annabel', 'Sandra', 'Sarah']
const filterItems = letters => names.filter(name => name.includes(letters))
console.log(filterItems('ia')) // ["Victoria", "Olivia"]
Array.prototype.map()
map()
方法將提供的函數(shù)應(yīng)用于數(shù)組的每個(gè)元素并返回一個(gè)新數(shù)組。
const arr = [1, 2, 3]
const double = x => x * 2
arr.map(double) // [2, 4, 6]
Array.prototype.flat()
flat
方法創(chuàng)建一個(gè)新數(shù)組绽慈,其中所有子數(shù)組元素遞歸連接到該數(shù)組中恨旱,直到指定的深度。
const arr1 = [1, 2, [3, 4]]
arr1.flat() // [1, 2, 3, 4]
const arr2 = [1, 2, [3, 4, [5, 6]]]
arr2.flat() // [1, 2, 3, 4, [5, 6]]
const arr3 = [1, 2, [3, 4, [5, 6]]]
arr3.flat(2) // [1, 2, 3, 4, 5, 6]
const arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]]
arr4.flat(Infinity) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
更多實(shí)現(xiàn)技巧可查閱數(shù)組扁平化坝疼。
Array.prototype.flatMap()
flatMap() 方法首先使用 map
方法映射每個(gè)元素搜贤,然后將結(jié)果壓縮成一個(gè)新數(shù)組。它與 map
連著深度值為 1 的 flat
幾乎相同钝凶,但 flatMap
通常在合并成一種方法的效率稍微高一些仪芒。
const arr = [1, 2, 3, 4]
arr.flatMap(x => [x * 2]) // [2, 4, 6, 8]
// 只有一層是扁平的
arr.flatMap(x => [[x * 2]]) // [[2], [4], [6], [8]]
Array.prototype.sort()
sort()
方法對(duì)數(shù)組中的元素進(jìn)行適當(dāng)排序并返回?cái)?shù)組。這種情況不一定穩(wěn)定。默認(rèn)排序順序根據(jù)字符串 Unicode 代碼點(diǎn)掂名。
const months = ['March', 'Jan', 'Feb', 'Dec']
months.sort() // ['Dec', 'Feb', 'Jan', 'March']
console.log(months) // ["Dec", "Feb", "Jan", "March"]
const arr = [1, 30, 4, 21, 100000]
arr.sort()
console.log(arr) // [1, 100000, 21, 30, 4]
我們可以向 sort
方法傳入一個(gè)指定按某種順序進(jìn)行排列的函數(shù)夭咬。
arr.sort((a, b) => a - b) // [1, 4, 21, 30, 100000]
arr.sort((a, b) => b - a) // [100000, 30, 21, 4, 1]
更多內(nèi)容可查閱如何在 JavaScript 中對(duì)對(duì)象數(shù)組進(jìn)行排序?
注意:該方法會(huì)改變?cè)瓟?shù)組铆隘。
Array.prototype.every()
every()
方法對(duì)數(shù)組中每一項(xiàng)運(yùn)行給定函數(shù)卓舵,如果函數(shù)對(duì)每一項(xiàng)都返回 true
,則返回 true
膀钠。
const arr = [1, 2, 3, 4, 5]
const isBelowThreshold = currentValue => currentValue < 10
console.log(arr.every(isBelowThreshold)) // true
Array.prototype.some()
some()
方法對(duì)數(shù)組中每一項(xiàng)運(yùn)行給定函數(shù)掏湾,如果函數(shù)對(duì)任一項(xiàng)返回 true
,則返回 true
肿嘲。
const arr = [1, 2, 3, 4, 5]
// 檢查元素是否為偶數(shù)
const even = item => item % 2 === 0
console.log(arr.some(even)) // true
示例:數(shù)組扁平化
let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]]
const flatten = function (arr) {
// 只要有一個(gè)元素為數(shù)組融击,那么循環(huán)繼續(xù)
while (arr.some(Array.isArray)) {
arr = [].concat(...arr)
}
return arr
}
console.log(flatten(arr))
Array.prototype.forEach()
forEach()
方法對(duì)每個(gè)數(shù)組元素執(zhí)行一次提供的回調(diào)函數(shù)。
const arr = ['a', 'b', 'c']
arr.forEach(item => console.log(item))
// "a"
// "b"
// "c"
Array.prototype.find()
find()
方法返回匹配器函數(shù)為其返回 true
的第一個(gè)元素雳窟。否則返回 -1尊浪。其結(jié)果是原始數(shù)組中的一個(gè)元素。
const arr = [10, 11, 3, 20, 5]
const greaterThanTen = arr.find(item => item > 10)
console.log(greaterThanTen) // 11
Array.prototype.findIndex()
findIndex()
方法返回?cái)?shù)組中滿足提供的測(cè)試函數(shù)的第一個(gè)元素的索引封救。否則返回 -1拇涤。
const arr = [5, 12, 8, 130, 44]
const isLargeNumber = item => item > 13
console.log(arr.findIndex(isLargeNumber)) // 3
Array.prototype.findLast/findLastIndex
通過(guò) find
和 findIndex
在數(shù)組中查找值是一種常見(jiàn)的做法。不過(guò)誉结,這些方法從數(shù)組開(kāi)頭開(kāi)始迭代鹅士。
const things = [{v: 1}, {v: 2}, {v: 3}, {v: 4}, {v: 5}]
things.find(item => item.v > 3) // {v: 4}
things.findIndex(item => item.v > 3) // 3
如果您想從數(shù)組的末尾開(kāi)始搜索數(shù)組,則必須反轉(zhuǎn)數(shù)組并使用提供的方法惩坑。這并不好掉盅,因?yàn)樗枰槐匾臄?shù)組突變。
幸運(yùn)的是以舒,有一個(gè)針對(duì) findLast
和 findLastIndex
的 ECMAscript 提案趾痘。
const things = [{v: 1}, {v: 2}, {v: 3}, {v: 4}, {v: 5}]
things.findLast(item => item.v > 3) // {v: 5}
things.findLastIndex(item => item.v > 3) // 4
該提案目前處于第三階段,目前已經(jīng) Edge蔓钟、chromium 和 Safari 的最新版本得到支持永票。至于其余的,core-js 和 Babel 已經(jīng)提供了一個(gè) polyfill奋刽。
以下是 findLast
的支持情況瓦侮,findLastIndex
與其相同:
Array.prototype.toLocaleString()
toLocaleString()
返回一個(gè)字符串表示數(shù)組中的元素。數(shù)組中的元素將使用各自的 toLocaleString 方法轉(zhuǎn)成字符串佣谐,這些字符串將使用一個(gè)特定語(yǔ)言環(huán)境的字符串(例如一個(gè)逗號(hào) ",")隔開(kāi)肚吏。
const arr = [1, 'a', new Date('21 Dec 1997 14:12:00 UTC')]
const localeString = arr.toLocaleString('en', { timeZone: 'UTC' })
console.log(localeString) // "1,a,12/21/1997, 2:12:00 PM"
// 這假設(shè) 'en' 語(yǔ)言環(huán)境和 UTC 時(shí)區(qū) - 您的結(jié)果可能會(huì)有所不同
Array.prototype.keys()
keys()
方法返回一個(gè)新的數(shù)組可迭代對(duì)象,包含原始數(shù)組中每個(gè)索引的鍵狭魂。
const arr = ['a', 'b', 'c']
for (let key of arr.keys()) {
console.log(key) // 0 1 2
}
Array.prototype.values()
values()
方法返回一個(gè)新的數(shù)組迭代器對(duì)象罚攀,該對(duì)象包含數(shù)組中每個(gè)索引的值党觅。
const arr = ['a', 'b', 'c']
for (const value of arr.values()) {
console.log(value) // "a" "b" "c"
}
Array.prototype.entries()
entries()
方法返回一個(gè)新的數(shù)組可迭代對(duì)象,該對(duì)象包含數(shù)組中每個(gè)索引的鍵/值對(duì)斋泄。
const arr = ['a', 'b', 'c']
const iterator = arr.entries()
console.log(iterator.next().value) // [0, "a"]
console.log(iterator.next().value) // [1, "b"]
Array.prototype.fill()
fill()
方法使用一個(gè)固定值來(lái)填充從起始索引(默認(rèn) 0
)到結(jié)束索引(默認(rèn) array.length
)的數(shù)組的所有元素杯瞻。它返回修改后的數(shù)組。
const arr = [1, 2, 3, 4]
// 從位置 2 到位置 4 填充 0
console.log(arr.fill(0, 2, 4)) // [1, 2, 0, 0]
// 從位置 1 填充 5
console.log(arr.fill(5, 1)) // [1, 5, 5, 5]
console.log(arr.fill(6)) // [6, 6, 6, 6]
Array(3) // [empty × 3]
const money = () => '??'
[...Array(3)].map(money) // ['??', '??', '??']
Array(3).fill('??') // ['??', '??', '??']
示例:重復(fù)字符串
Array(3)
.fill('LOVE')
.join('')
// "LOVELOVELOVE"
該片段的運(yùn)行很簡(jiǎn)單:Array(3)
創(chuàng)建一個(gè)包含 3 個(gè)空項(xiàng)的新數(shù)組炫掐,fill('LOVE')
在每個(gè)空項(xiàng)中填充 LOVE魁莉,join()
將所有元素連接成一個(gè)字符串。
注意:該方法會(huì)改變?cè)瓟?shù)組募胃。
Array.prototype.copyWithin()
copyWithin()
方法將數(shù)組的一部分復(fù)制到同一數(shù)組中的另一個(gè)位置并返回它旗唁,而不修改其大小。
const arr = ['a', 'b', 'c', 'd', 'e']
// 將索引 3 處的元素復(fù)制到索引 0
console.log(arr.copyWithin(0, 3, 4)) // ["d", "b", "c", "d", "e"]
// 將從索引 3 到末尾的所有元素復(fù)制到索引 1
console.log(arr.copyWithin(1, 3)) // ["d", "d", "e", "d", "e"]
注意:該方法會(huì)改變?cè)瓟?shù)組痹束。
Array.prototype.of()
Array.of()
方法從數(shù)量可變的參數(shù)創(chuàng)建一個(gè)新的數(shù)組實(shí)例检疫,而不管參數(shù)的數(shù)量或類型如何。
Array.of(7) // [7]
Array(7) // [empty × 7]祷嘶,7個(gè)空插槽的數(shù)組
Array.of(1, 2, 3) // [1, 2, 3]
Array(1, 2, 3) // [1, 2, 3]
Array.of()
和數(shù)組構(gòu)造函數(shù)之間的區(qū)別在于處理整數(shù)參數(shù):Array.of(7)
創(chuàng)建一個(gè)包含單個(gè)元素 7 的數(shù)組屎媳,而 Array(7)
創(chuàng)建一個(gè)長(zhǎng)度屬性為 7 的空數(shù)組(注意:這意味著數(shù)組包含 7 個(gè)空插槽,而不是包含實(shí)際未定義值的插槽)论巍。
Array.prototype.from()
Array.from()
用于將類數(shù)組對(duì)象或可迭代對(duì)象轉(zhuǎn)化為一個(gè)新的淺拷貝數(shù)組實(shí)例烛谊。
console.log(Array.from('foo')) // ["f", "o", "o"]
console.log(Array.from([1, 2, 3], x => x + x)) // [2, 4, 6]
Array.from()
接受第二個(gè) map
參數(shù)。方便創(chuàng)建和填充特定長(zhǎng)度的數(shù)組环壤。
ES6 Set
是可以相互轉(zhuǎn)換的晒来,可以使用 Array.from
轉(zhuǎn)換成數(shù)組
const article = new Set(['JavaScript', 'TypeScript', 'Node.js'])
article // Set(3) {'JavaScript', 'TypeScript', 'Node.js'}
Array.from(article) // ['JavaScript', 'TypeScript', 'Node.js']
示例:重復(fù)字符串
一個(gè)類數(shù)組對(duì)象必須含有 length
屬性,且元素屬性名必須是數(shù)值或者可轉(zhuǎn)換為數(shù)值的字符郑现。我們正好可以利用這一點(diǎn)。
我們將 length
屬性設(shè)置為 3荧降,使用 from()
方法初始化數(shù)組接箫,每個(gè)位置對(duì)應(yīng) 1 個(gè) undefined
。 如下:
Array.from({ length: 3 }) // [undefined, undefined, undefined]
現(xiàn)在我們使用第二個(gè)參數(shù)朵诫,這是一個(gè) map
函數(shù)辛友,它將調(diào)用數(shù)組的每個(gè)元素。在這里剪返,我們用 'LOVE'
替換所有的 undefined
废累。
Array.from({ length: 3 }, () => 'LOVE') // ['LOVE', 'LOVE', 'LOVE']
最后我們調(diào)用 join()
方法將數(shù)組中的所有元素組合成一個(gè)字符串。
Array.from({ length: 3 }, () => 'LOVE').join('') //'LOVELOVELOVE'
分塊
在使用 API 時(shí)脱盲,我經(jīng)常需要將用戶列表分塊并批量發(fā)送邑滨。Array.from()
是一種將數(shù)組分塊的好方法,因?yàn)榈诙€(gè)參數(shù)是一個(gè) map
函數(shù)钱反。
function chunkify(array, chunkSize = 10) {
const chunks = Array.from(
{ length: Math.ceil(array.length / 10) },
(_, i) => {
const start = chunkSize * i
return array.slice(start, start + chunkSize)
}
)
return chunks
}
chunkify(hugeArray) // [[...], [...], ....]
Array.prototype.toString()
toString()
方法返回一個(gè)字符串掖看,表示指定的數(shù)組及其元素匣距。
const arr = [1, 2, 'a', 'b']
console.log(arr.toString()) // "1,2,a,b"
const arr = [1, 2, 3, [4, 5, 6]]
console.log(arr.toString()) // "1,2,3,4,5,6"
Array.prototype.valueOf()
valueOf()
方法返回指定對(duì)象的原始值。
不同對(duì)象的 valueOf
方法不盡一致哎壳,數(shù)組的 valueOf
方法返回?cái)?shù)組本身毅待。
const arr = [1, 2, 3]
arr.valueOf() // [1, 2, 3]
詳細(xì)查看 MDN 上
valueOf
各個(gè)類型的示例。
有無(wú) mutation
mutation
譯為突變归榕,可以簡(jiǎn)單理解為是否改變?cè)瓟?shù)組尸红,有無(wú)副作用。
mutation:
-
splice()
刹泄、copyWithin()
驶乾、fill()
、pop()
循签、push()
-
reverse()
级乐、shift()
、sort()
县匠、unshift()
no mutation:
-
some()
风科、map()
、forEach()
乞旦、every()
贼穆、filter()
、reduce()
兰粉、reduceRight()
-
find()
故痊、findIndex()
、lastIndexOf()
玖姑、includes()
愕秫、indexOf()
、findLast()
焰络、findLastIndex()
-
join()
戴甩、slice()
、concat()
闪彼、flat()
甜孤、flatMap()
、of()
畏腕、from()
-
toLocaleString()
缴川、toSource()
、toString()
描馅、valueOf()
把夸、keys()
、values()
流昏、entries()
根據(jù)特定條件搜索
上面已經(jīng)介紹了數(shù)組的所有方法扎即,我們可以使用一些數(shù)組方法來(lái)代替 for
循環(huán)來(lái)搜索數(shù)組吞获。根據(jù)需要,您可以決定哪種方法最適合您的用例谚鄙。
- 如果要查找數(shù)組中滿足特定條件的所有項(xiàng)各拷,請(qǐng)使用
filter
。 - 如果要檢查至少一項(xiàng)是否滿足特定條件闷营,請(qǐng)使用
find
烤黍。 - 如果要檢查數(shù)組是否包含特定值,請(qǐng)使用
includes
傻盟。 - 如果要查找數(shù)組中特定項(xiàng)的索引速蕊,請(qǐng)使用
indexOf
。 - 如果要檢查數(shù)組中所有元素是否滿足給定條件娘赴,并且返回一個(gè)布爾值规哲,請(qǐng)使用
every
。 - 如果要檢查數(shù)組中任一元素是否滿足給定條件诽表,并且返回一個(gè)布爾值唉锌,請(qǐng)使用
some
。
concat 和 push 的區(qū)別
concat
和 push
是將一個(gè)或多個(gè)項(xiàng)附加到給定數(shù)組的常用方法竿奏。
區(qū)別
concat
方法不會(huì)更改現(xiàn)有數(shù)組:
const shapes = ['Triangle', 'Square']
shapes.concat(['Circle', 'Rectangle']) // ['Triangle', 'Square', 'Circle', 'Rectangle']
shapes // ['Triangle', 'Square']
另一方面袄简,push
方法會(huì)修改原始數(shù)組。
const animals = ['cat', 'dog', 'mouse']
animals.push('bird', 'cow') // 5
animals // ['cat', 'dog', 'mouse', 'bird', 'cow']
在上面的示例代碼中泛啸,兩種方法產(chǎn)生不同的結(jié)果绿语。concat
返回一個(gè)新數(shù)組,push
返回更新數(shù)組的長(zhǎng)度候址。
因?yàn)?concat
創(chuàng)建了一個(gè)新數(shù)組來(lái)保存合并數(shù)組的結(jié)果吕粹,所以它比 push
慢。
對(duì)于小型數(shù)組宗雇,這兩種方法在性能方面不會(huì)產(chǎn)生顯著差異昂芜。但是如果你必須使用大數(shù)組,性能是應(yīng)用程序的關(guān)鍵赔蒲,那么考慮使用 push
。
提示
您可以使用 ES6 擴(kuò)展運(yùn)算符將不同的數(shù)組合并為一個(gè):
const a = [1, 2, 3]
const b = [4, 5, 6]
const c = [7, 8, 9]
const final = [...a, ...b, ...c] // [1, 2, 3, 4, 5, 6, 7, 8, 9]
如果我們也使用 push
方法良漱,則擴(kuò)展運(yùn)算符很方便:
const a = [1, 2, 3]
const b = [4, 5, 6]
a.push(...b) // 6
a // [1, 2, 3, 4, 5, 6]
Array.prototype.push.apply(firstArray, secondArray)
是另一個(gè)同樣適用于 ES5 的選項(xiàng)舞虱。但是,如果第二個(gè)數(shù)組非常大母市,則不建議使用這種方法矾兜,因?yàn)橐粋€(gè)函數(shù)中的最大參數(shù)數(shù)是有限的。
Array.prototype.push.apply(a, b) // 6
a // [1, 2, 3, 4, 5, 6]
如果你好奇的話患久,它的硬編碼是 65536椅寺。
Javascript Array.push is 945x faster than Array.concat ???? 提供了許多基準(zhǔn)來(lái)證明為什么 push
比 concat
更快浑槽。
slice
和 splice
的區(qū)別
slice
和 splice
是獲取給定數(shù)組子數(shù)組的常用方法。
區(qū)別
語(yǔ)法:
array.slice(startingIndex, endingIndex)
array.splice(startingIndex, length, ...items)
雖然第一個(gè)參數(shù)彼此相同返帕,表示刪除元素的起始索引桐玻,但第二個(gè)參數(shù)不同。
slice
和 splice
的第二個(gè)參數(shù)分別是結(jié)束索引和子項(xiàng)數(shù)荆萤。
splice
更改原始數(shù)組镊靴,而 slice
不更改。
給定從 1 到 5 的數(shù)字?jǐn)?shù)組:
const arr = [1, 2, 3, 4, 5]
const sub = arr.splice(2, 3)
// 原始數(shù)組已修改
arr // [1, 2]
sub // [3, 4, 5]
現(xiàn)在链韭,讓我們將相同的參數(shù)傳遞給 slice
:
const arr = [1, 2, 3, 4, 5]
const sub = arr.slice(2, 3)
// 原始數(shù)組未被修改
arr // [1, 2, 3, 4, 5]
sub // [3]
使用 splice
方法偏竟,可以通過(guò)將項(xiàng)目傳遞到最后一個(gè)參數(shù)來(lái)保持項(xiàng)目不從原始數(shù)組中移除。
const arr = [1, 2, 3, 4, 5]
const sub = arr.splice(2, 3, 3, 4, 5)
arr // [1, 2, 3, 4, 5]
提示
我們可以通過(guò)忽略結(jié)束索引來(lái)克隆數(shù)組(淺拷貝):
const clone = arr => arr.slice(0)
更多詳細(xì)內(nèi)容可查閱淺拷貝和深拷貝
some
和 every
這兩個(gè)方法類似斷言(assert)敞峭,返回一個(gè)布爾值踊谋,表示判斷數(shù)組成員是否符合某種條件。
在前面方法的介紹中旋讹,我們已經(jīng)大致了解了 every
和 some
方法的工作原理殖蚕,下面是您可以從中獲得的一些附加功能:
-
Array.every
和Array.some
可以接受第二個(gè)參數(shù),該參數(shù)將在回調(diào)函數(shù)的執(zhí)行中用作this
參數(shù)骗村。 - 回調(diào)函數(shù)可以接受兩個(gè)額外的參數(shù):當(dāng)前項(xiàng)的索引和對(duì)調(diào)用該方法的數(shù)組的引用嫌褪。
來(lái)看看一個(gè)示例:
const obj = { name: 'Daffodil' }
const arr = [1, 2, 3, 4, 5, 6]
arr.every(function (el, i, arr) {
return el > i && arr[i] === el && this === obj
}, obj) // true
- 每個(gè)元素都大于其索引
-
arr[i]
(其中i
當(dāng)前索引與當(dāng)前元素相同) - 我們提供了
obj
作為this
參數(shù)的引用,因此this
等于obj
注意:對(duì)于空數(shù)組胚股,
some
方法返回false
笼痛,every
方法返回true
,回調(diào)函數(shù)都不會(huì)執(zhí)行琅拌。
const isEven = x => x % 2 === 0
[].some(isEven) // false
[].every(isEven) // true
some
和 every
方法還可以接受第二個(gè)參數(shù)缨伊,用來(lái)綁定參數(shù)函數(shù)內(nèi)部的 this
變量。
通過(guò)索引獲取元素
const list = [1, 2, 3, 4, 5]
list[1] // 2
list.indexOf(2) // 1
通過(guò)索引獲取數(shù)組的子集
不改變?cè)瓟?shù)組
list.slice(0,1) // [1]
list.slice(1) // [2, 3, 4, 5]
list.slice(1,2) // [2]
改變?cè)瓟?shù)組
re = list.splice(1) // re = [2, 3, 4, 5] list == [1]
re = list.splice(1,2) // re = [2, 3] list == [1, 4, 5]
刪除元素
const list = [1, 2, 3, 4, 5]
list.pop() // 5 list == [1, 2, 3, 4]
list.shift() // 1 list == [2, 3, 4, 5]
list.splice(2, 1) // [3] list == [1, 2, 3, 4]
替換元素
const list = [1, 2, 3, 4, 5]
list.splice(2, 1, 6) // list == [1, 2, 6, 4, 5]
插入
const list = [1, 2, 3, 4, 5]
// 指定元素之后插入
list.splice(list.indexOf(2) + 1, 0, 1) // [1, 2, 1, 3, 4, 5]
// 指定元素之前插入
list.splice(list.indexOf(2), 0, 6) // [1, 6, 2, 1, 3, 4, 5]
添加元素
不改變?cè)瓟?shù)組
list.concat([6]) // [1, 2, 3, 4, 5, 6]
改變?cè)瓟?shù)組
list.push(6) // list == [1, 2, 3, 4, 5, 6]
list.unshift(6) // list == [6, 5, 4, 3, 2, 1]
list.splice(2, 0, 6) // list == [1, 2, 6, 3, 4, 5]
更多資料
以下整理了過(guò)往寫(xiě)過(guò)關(guān)于數(shù)組的文章:
- 如何在 JavaScript 中對(duì)對(duì)象數(shù)組進(jìn)行排序进宝?
- 數(shù)組扁平化
- JavaScript 數(shù)組去重
- 如何在 JavaScript 中合并兩個(gè)數(shù)組刻坊?
- 如何在 JavaScript 中判斷值是否為數(shù)組?
- 如何在 JavaScript 中將數(shù)組轉(zhuǎn)為對(duì)象
- 檢查數(shù)組是否已排序
- 過(guò)濾并排序字符串列表
- 數(shù)組平均值與中位數(shù)
- 從數(shù)組中刪除重復(fù)的對(duì)象
- 數(shù)組中的最大值/最小值
- JavaScript 中清空數(shù)組
- 如何在 JavaScript 中將數(shù)組拆分為一組數(shù)組
- 如何在 JavaScript 中判斷數(shù)組是否包含某個(gè)值党晋?