join()
將數(shù)組的元素組起一個(gè)字符串,以separator為分隔符,省略的話則用默認(rèn)用逗號(hào)為分隔符,該方法只接收一個(gè)參數(shù):即分隔符。不改變?cè)瓟?shù)組。
push()
可以接收任意數(shù)量的參數(shù),把它們逐個(gè)添加到數(shù)組末尾,并返回修改后數(shù)組的長(zhǎng)度。改變?cè)瓟?shù)組。
unshift()
可以接收任意數(shù)量的參數(shù),把它們逐個(gè)添加到數(shù)組開(kāi)始,并返回修改后數(shù)組的長(zhǎng)度。改變?cè)瓟?shù)組。
pop()
移除數(shù)組最后一項(xiàng),減少數(shù)組的 length 值,然后返回移除的項(xiàng)。改變?cè)瓟?shù)組。
shift()
移除數(shù)組第一項(xiàng),減少數(shù)組的 length 值,然后返回移除的項(xiàng)。改變?cè)瓟?shù)組。
reverse()
方法用于顛倒數(shù)組中元素的順序,然后返回改變的原來(lái)的數(shù)組。改變?cè)瓟?shù)組。
sort()
按升序排列數(shù)組項(xiàng)——即最小的值位于最前面,最大的值排在最后面。
如果調(diào)用該方法時(shí)沒(méi)有使用參數(shù),將按字母順序?qū)?shù)組中的元素進(jìn)行排序,說(shuō)得更精確點(diǎn),是按照字符編碼的順序進(jìn)行排序。要實(shí)現(xiàn)這一點(diǎn),首先應(yīng)把數(shù)組的元素都轉(zhuǎn)換成字符串(如有必要),以便進(jìn)行比較。改變?cè)瓟?shù)組
如果想按照其他標(biāo)準(zhǔn)進(jìn)行排序,就需要提供比較函數(shù),該函數(shù)要比較兩個(gè)值,然后返回一個(gè)用于說(shuō)明這兩個(gè)值的相對(duì)順序的數(shù)字。比較函數(shù)應(yīng)該具有兩個(gè)參數(shù) a 和 b,其返回值如下:
若 a 小于 b,在排序后的數(shù)組中 a 應(yīng)該出現(xiàn)在 b 之前,則返回一個(gè)小于 0 的值。
若 a 等于 b,則返回 0。
若 a 大于 b,則返回一個(gè)大于 0 的值。
如:arr.sort((a,b)=>a-b);為升序排列。
concat()
將參數(shù)添加到原數(shù)組中。這個(gè)方法會(huì)先創(chuàng)建當(dāng)前數(shù)組一個(gè)副本,然后將接收到的參數(shù)添加到這個(gè)副本的末尾,最后返回新構(gòu)建的數(shù)組。不改變?cè)瓟?shù)組。
傳入的不是數(shù)組,則直接把參數(shù)添加到數(shù)組后面,如果傳入的是數(shù)組,則將數(shù)組中的各個(gè)項(xiàng)添加到數(shù)組中。如果傳入的是一個(gè)二維數(shù)組
var arrCopy2 = arr.concat([9,[11,13]]);
console.log(arrCopy2); //[1, 3, 5, 7, 9, Array[2]]
slice()
返回從原數(shù)組中指定開(kāi)始下標(biāo)到結(jié)束下標(biāo)之間的項(xiàng)組成的新數(shù)組。slice()方法可以接受一或兩個(gè)參數(shù),即要返回項(xiàng)的起始和結(jié)束位置。在只有一個(gè)參數(shù)的情況下, slice()方法返回從該參數(shù)指定位置開(kāi)始到當(dāng)前數(shù)組末尾的所有項(xiàng)。如果有兩個(gè)參數(shù),該方法返回起始和結(jié)束位置之間的項(xiàng)——但不包括結(jié)束位置的項(xiàng)(含頭不含尾);參數(shù)可以為負(fù)數(shù),如-2,(例如-2),如果為負(fù)值則起始計(jì)算方式為(str.length-2),不改變?cè)瓟?shù)組。
splice()
很強(qiáng)大的數(shù)組方法,它有很多種用法,可以實(shí)現(xiàn)刪除、插入和替換。
- 刪除:可以刪除任意數(shù)量的項(xiàng),只需指定 2 個(gè)參數(shù):要?jiǎng)h除的第一項(xiàng)的位置和要?jiǎng)h除的項(xiàng)數(shù)。例如, splice(0,2)會(huì)刪除數(shù)組中的前兩項(xiàng)。返回被切除的元素的數(shù)組,原數(shù)組被改變,為切除后剩下的元素。
- 插入:可以向指定位置插入任意數(shù)量的項(xiàng),只需提供 3 個(gè)參數(shù):起始位置、 0(要?jiǎng)h除的項(xiàng)數(shù))和要插入的項(xiàng)。例如,splice(2,0,4,6)會(huì)從當(dāng)前數(shù)組的位置 2 開(kāi)始插入4和6。返回值為空數(shù)組,因?yàn)榍谐膫€(gè)數(shù)為0,改變?cè)瓟?shù)組。
- 替換:可以向指定位置插入任意數(shù)量的項(xiàng),且同時(shí)刪除任意數(shù)量的項(xiàng),只需指定 3 個(gè)參數(shù):起始位置、要?jiǎng)h除的項(xiàng)數(shù)和要插入的任意數(shù)量的項(xiàng)。插入的項(xiàng)數(shù)不必與刪除的項(xiàng)數(shù)相等。例如,splice (2,1,4,6)會(huì)刪除當(dāng)前數(shù)組位置 2 的項(xiàng),然后再?gòu)奈恢?2 開(kāi)始插入4和6。返回被切除的元素的數(shù)組,改變?cè)瓟?shù)組。
splice()方法始終都會(huì)返回一個(gè)數(shù)組,該數(shù)組中包含從原始數(shù)組中刪除的項(xiàng),如果沒(méi)有刪除任何項(xiàng),則返回一個(gè)空數(shù)組。
fill()
fill(value, start, end)使用給定value填充數(shù)組,從索引start開(kāi)始end結(jié)束,不包含end,可以為負(fù)值,如果是負(fù)值,從末尾開(kāi)始計(jì)數(shù),改變?cè)瓟?shù)組。
flat()
將二維數(shù)組變?yōu)橐痪S數(shù)組,不改變?cè)瓟?shù)組。
var newArray = arr.flat(depth),參數(shù)說(shuō)明:depth,可選,指定嵌套數(shù)組中的結(jié)構(gòu)深度,默認(rèn)值為1;若depth為Infinity`展開(kāi)所有嵌套數(shù)組。
flat()方法會(huì)移除數(shù)組中的空項(xiàng)。但undefined、null仍會(huì)保留。
flatMap()
相當(dāng)于map與flat的結(jié)合,不改變?cè)瓟?shù)組。
indexOf()
接收兩個(gè)參數(shù):要查找的項(xiàng)和(可選的)表示查找起點(diǎn)位置的索引。其中, 從數(shù)組的開(kāi)頭(位置 0)開(kāi)始向后查找。返回值為索引或-1
lastIndexOf()
接收兩個(gè)參數(shù):要查找的項(xiàng)和(可選的)表示查找起點(diǎn)位置的索引。其中, 從數(shù)組的末尾開(kāi)始向前查找。返回值為索引或-1
reduce()和 reduceRight()
這兩個(gè)方法都會(huì)實(shí)現(xiàn)迭代數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)最終返回的值。reduce()方法從數(shù)組的第一項(xiàng)開(kāi)始,逐個(gè)遍歷到最后。而 reduceRight()則從數(shù)組的最后一項(xiàng)開(kāi)始,向前遍歷到第一項(xiàng)。
這兩個(gè)方法都接收兩個(gè)參數(shù):一個(gè)在每一項(xiàng)上調(diào)用的函數(shù)和(可選的)作為歸并基礎(chǔ)的初始值。
傳給 reduce()和 reduceRight()的函數(shù)接收 4 個(gè)參數(shù):前一個(gè)值、當(dāng)前值、項(xiàng)的索引和數(shù)組對(duì)象。這個(gè)函數(shù)返回的任何值都會(huì)作為第一個(gè)參數(shù)自動(dòng)傳給下一項(xiàng)。第一次迭代發(fā)生在數(shù)組的第二項(xiàng)上,因此第一個(gè)參數(shù)是數(shù)組的第一項(xiàng),第二個(gè)參數(shù)就是數(shù)組的第二項(xiàng)。
下面代碼用reduce()實(shí)現(xiàn)數(shù)組求和,數(shù)組一開(kāi)始加了一個(gè)初始值10。
var values = [1,2,3,4,5];
var sum = values.reduceRight(function(prev, cur, index, array){
return prev + cur; //也就是說(shuō)prev + cur為迭代后函數(shù)里的參數(shù)prev
},10);
console.log(sum); //25
every()
判斷數(shù)組中每一項(xiàng)都是否滿(mǎn)足條件,只有所有項(xiàng)都滿(mǎn)足條件,才會(huì)返回true。
參數(shù)為函數(shù)。返回值為boolean
some()
判斷數(shù)組中是否存在滿(mǎn)足條件的項(xiàng),只要有一項(xiàng)滿(mǎn)足條件,就會(huì)返回true。
參數(shù)為函數(shù)。返回值為boolean
find():返回通過(guò)測(cè)試的數(shù)組的第一個(gè)元素的值
語(yǔ)法:array.find(function(value, index, arr),thisValue)
value:必須,代表當(dāng)前元素,其他三個(gè)參數(shù)都是可選,index代表當(dāng)前索引值,arr代表當(dāng)前的數(shù)組,thisValue代表傳遞給函數(shù)內(nèi)this的值,一般用this值,如果這個(gè)參數(shù)為空,通常undefined會(huì)傳遞給this值
findIndex():返回通過(guò)測(cè)試的數(shù)組的第一個(gè)元素的值的索引
語(yǔ)法:array.find(function(value, index, arr),thisValue)
返回值:返回符合測(cè)試條件的第一個(gè)數(shù)組元素的值的索引,如果沒(méi)有符合條件的則返回undefined。
filter():創(chuàng)建一個(gè)新數(shù)組,新數(shù)組中的元素是通過(guò)檢查指定數(shù)組中符合條件的所有元素
語(yǔ)法:array.filter(function(value, index, arr),thisValue)
value:必須,代表當(dāng)前元素,其他三個(gè)參數(shù)都是可選,index代表當(dāng)前索引值,arr代表當(dāng)前的數(shù)組,thisValue代表傳遞給函數(shù)的值,一般用this值,如果這個(gè)參數(shù)為空,undefined會(huì)傳遞給this值
返回值:返回?cái)?shù)組,包含了符合條件的所有元素,如果沒(méi)有符合條件的則返回空數(shù)組。
map():返回一個(gè)新數(shù)組,數(shù)組中的元素為原始數(shù)組元素調(diào)用函數(shù)處理后的值,map()方法按照原始數(shù)組元素順序依次處理元素
語(yǔ)法:array.map(function(value, index, arr),thisValue)
value:必須,代表當(dāng)前元素,其他三個(gè)參數(shù)都是可選,index代表當(dāng)前索引值,arr代表當(dāng)前的數(shù)組,thisValue代表傳遞給函數(shù)的值,一般用this值,如果這個(gè)參數(shù)為空,undefined會(huì)傳遞給this值
返回值:返回一個(gè)新數(shù)組,數(shù)組中的元素為原始數(shù)組元素調(diào)用函數(shù)處理后的值。
forEach():用于調(diào)用數(shù)組每個(gè)元素,并將元素傳遞給回調(diào)函數(shù)(注意沒(méi)有辦法跳出或終止forEach語(yǔ)句,除非拋出異常)
語(yǔ)法:array.forEach(function(value, index, arr),thisValue)
value:必須,代表當(dāng)前元素,其他三個(gè)參數(shù)都是可選,index代表當(dāng)前索引值,arr代表當(dāng)前的數(shù)組,thisValue代表傳遞給函數(shù)的值,一般用this值,如果這個(gè)參數(shù)為空,undefined會(huì)傳遞給this值
返回值:undefined
從上面的內(nèi)容我們可以看出,上面的四個(gè)語(yǔ)法以及參數(shù)的意義是一樣的,而且都不會(huì)對(duì)空數(shù)組進(jìn)行檢測(cè),也不會(huì)改變?cè)紨?shù)組
find()方法主要用來(lái)返回?cái)?shù)組中符合條件的第一個(gè)元素(沒(méi)有的話,返回undefined)
filter()方法主要用來(lái)篩選數(shù)組中符合條件的所有元素,并且放在一個(gè)新數(shù)組中,如果沒(méi)有,返回一個(gè)空數(shù)組
map()方法主要用來(lái)對(duì)數(shù)組中的元素調(diào)用函數(shù)進(jìn)行處理,并且把處理結(jié)果放在一個(gè)新數(shù)組中返回(如果沒(méi)有返回值,新數(shù)組中的每一個(gè)元素都為undefined)
forEach()方法也是用于對(duì)數(shù)組中的每一個(gè)元素執(zhí)行一次回調(diào)函數(shù),但它沒(méi)有返回值(或者說(shuō)它的返回值為undefined,即便我們?cè)诨卣{(diào)函數(shù)中寫(xiě)了return語(yǔ)句,返回值依然為undefined)
copyWithin()
copyWithin(target, start, end)將數(shù)組從start到end索引的元素(不包含end)復(fù)制到target開(kāi)始的索引位置,改變?cè)瓟?shù)組。
// Base
let a = [1, 2, 3, 4, 5]
let result = a.copyWithin(0, 3, 5)
console.log(result) // [4, 5, 3, 4, 5]
console.log(a) // [4, 5, 3, 4, 5] 索引3到5的元素為4和5,復(fù)制到從0開(kāi)始的位置,替換掉了1和2
// More
a = [1, 2, 3, 4, 5]
console.log(a.copyWithin(2)) // [1, 2, 1, 2, 3] 參數(shù)只有一個(gè)時(shí),start默認(rèn)為0,end默認(rèn)為數(shù)組長(zhǎng)度-1
toLocaleString()
將數(shù)組中的每個(gè)元素使用各自的toLocaleString()轉(zhuǎn)換后用,拼接,不改變?cè)瓟?shù)組。
let a = [1, new Date(), 'a', {m: 1}]
let result = a.toLocaleString()
console.log(result) // '1,2018/10/3 下午9:23:59,a,[object Object]'
console.log(a) // [1, Wed Oct 03 2018 21:23:59 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間), "a", {m: 1}]
迭代器對(duì)象
entries()
返回一個(gè)新的Array迭代器對(duì)象,可用for...of遍歷(不改變?cè)瓟?shù)組)
keys()
返回一個(gè)新的Array迭代器對(duì)象,可用for...of遍歷(不改變?cè)瓟?shù)組)
values()
返回一個(gè)新的迭代器(不改變?cè)瓟?shù)組)
解析數(shù)據(jù)成樹(shù)形結(jié)構(gòu)的方法
const comments = [
{ id: 1, parent_id: null },
{ id: 6, parent_id: null },
{ id: 7, parent_id: null },
{ id: 2, parent_id: 6 },
{ id: 2, parent_id: 7 },
{ id: 3, parent_id: 7 },
{ id: 4, parent_id: 7 },
{ id: 2, parent_id: 1 },
{ id: 3, parent_id: 1 },
{ id: 4, parent_id: 2 },
{ id: 5, parent_id: 4 }
];
const nest = (items, id = null, link = 'parent_id') =>
items
.filter(item => item[link] === id)
.map(item => ({ ...item, children: nest(items, item.id) }));