js實(shí)現(xiàn)數(shù)組的扁平化
數(shù)組扁平化的方式
什么是數(shù)組扁平化?
數(shù)組扁平化:指將一個(gè)多維數(shù)組轉(zhuǎn)化為一個(gè)一維數(shù)組。
例:將下面數(shù)組扁平化處理。
const arr = [1, [2, 3, [4, 5]]] // ---> [ 1, 2, 3, 4, 5 ]
1.使用flat()
flat() 方法是ES10提出的,它會(huì)按照一個(gè)可指定的深度遞歸遍歷數(shù)組,并將所有元素與遍歷到的子數(shù)組中的元素合并為一個(gè)新數(shù)組返回。(flat意為“水平的;平坦的”)
const result1 = arr.flat(Infinity) // 指定深度為無(wú)限 console.log(result1) // [ 1, 2, 3, 4, 5 ] const result2 = arr.flat(1) // 指定深度為1 console.log(result2) // [ 1, 2, 3, [ 4, 5 ] ] const result3 = arr.flat(2) // 指定深度為2 console.log(result3) // [ 1, 2, 3, 4, 5 ]
2.使用正則
以下做法得到的數(shù)組元素都會(huì)變成字符串,不建議使用;
const result1 = JSON.stringify(arr).replace(/\[|\]/g, '').split(',') console.log(result1) // [ '1', '2', '3', '4', '5' ] 數(shù)組元素都變成了字符串
對(duì)以上方法進(jìn)行優(yōu)化處理;
const result2 = JSON.parse('[' + JSON.stringify(arr).replace(/\[|\]/g, '') + ']') console.log(result2) // [ 1, 2, 3, 4, 5 ]
3.使用reduce()+concat()
使用reduce拿到數(shù)組的當(dāng)前值和前一項(xiàng)值,判斷當(dāng)前值是否為數(shù)組,初始值設(shè)置為[],然后使用concat進(jìn)行數(shù)組合并。
- reduce()方法:對(duì)數(shù)組中的每個(gè)元素執(zhí)行一個(gè)由您提供的reducer函數(shù)(升序執(zhí)行),將其結(jié)果匯總為單個(gè)返回值。
- concat()方法:用于合并兩個(gè)或多個(gè)數(shù)組。此方法不會(huì)更改現(xiàn)有數(shù)組,而是返回一個(gè)新數(shù)組。
function flatten(arr) { return arr.reduce((pre, current) => { return pre.concat(Array.isArray(current) ? flatten(current) : current) }, []) } const result = flatten(arr) console.log(result) // [ 1, 2, 3, 4, 5 ]
4.使用函數(shù)遞歸
循環(huán)遍歷數(shù)組,發(fā)現(xiàn)含有數(shù)組元素就進(jìn)行遞歸處理,最終將數(shù)組轉(zhuǎn)為一維數(shù)組。
const result = [] function exec(arr) { arr.forEach(item => { if (Array.isArray(item)) { exec(item) } else { result.push(item) } }) } exec(arr) console.log(result) // [ 1, 2, 3, 4, 5 ]
5.使用擴(kuò)展運(yùn)算符+concat()
ES6新推出的擴(kuò)展運(yùn)算符能對(duì)數(shù)組進(jìn)行降維處理(一次降一維),循環(huán)判斷是否含有數(shù)組,進(jìn)行concat合并。
some()方法:測(cè)試數(shù)組中是不是至少有1個(gè)元素通過(guò)了被提供的函數(shù)測(cè)試(它返回的是一個(gè)Boolean類(lèi)型的值)。
function flatten(arr) { while (arr.some(item => Array.isArray(item))) { arr = [].concat(...arr) } return arr } const result = flatten(arr) console.log(result) // [ 1, 2, 3, 4, 5 ]
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之棧詳解
這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之棧詳解,本文講解了對(duì)棧的操作、對(duì)棧的實(shí)現(xiàn)實(shí)例等內(nèi)容,需要的朋友可以參考下2015-03-03JavaScript函數(shù)式編程(Functional Programming)組合函數(shù)(Composition)用法分析
這篇文章主要介紹了JavaScript函數(shù)式編程(Functional Programming)組合函數(shù)(Composition)用法,結(jié)合實(shí)例形式分析了javascript函數(shù)式編程中組合函數(shù)的概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2019-05-05關(guān)于JavaScript的gzip靜態(tài)壓縮方法
關(guān)于JavaScript的gzip靜態(tài)壓縮方法...2007-01-01Js,alert出現(xiàn)亂碼問(wèn)題的解決方法
Js,alert出現(xiàn)亂碼問(wèn)題的解決方法,需要的朋友可以參考一下2013-06-06javascript 隱藏/顯示指定的區(qū)域附HTML元素【legend】用法
今日閑來(lái)無(wú)事就寫(xiě)寫(xiě)JS,用來(lái)顯示/隱藏制定的DIV區(qū)域。2010-03-03