js嵌套的數(shù)組扁平化:將多維數(shù)組變成一維數(shù)組以及push()與concat()區(qū)別的講解
數(shù)組的扁平化:將多維數(shù)組變成一維數(shù)組
對(duì)于一個(gè)像這樣的嵌套數(shù)組:a=[1,[2,[3,4]],5,6]我們想要把它變成一個(gè)一維數(shù)組,有下面幾種方法:
方法一:遞歸一
function parseArr(arr,res){ var i=0; for(i=0;i<arr.length;i++){ if(arr[i] instanceof Array){ parseArr(arr[i],res); }else{ res.push(arr[i]); } } } var a=[1,[2,[3,4]],5,6]; var res=[]; parseArr(a,res);
遞歸二(推薦)
var arr = ['mu','zi',['dig',['big','love']]] function flatten(arr){ var res = []; for(var i=0;i<arr.length;i++){ if(Array.isArray(arr[i])){ res = res.concat(flatten(arr[i])); }else{ res.push(arr[i]); } } return res; } console.log(flatten(arr))//["mu", "zi", "dig", "big", "love"]
對(duì)上面的方法進(jìn)行解析:
1.語法: Array.isArray(object);
參數(shù):object必需。要測(cè)試的對(duì)象。
返回值
如果 object 是數(shù)組,則為 true;否則為 false。 如果 object 參數(shù)不是對(duì)象,則返回 false。
2.push()與concat()的區(qū)別
- 1,push()是在原數(shù)組的基礎(chǔ)上修改的,執(zhí)行push()方法后原數(shù)組的值也會(huì)變,在原數(shù)組后面添加值;若操作concat()的是一個(gè)數(shù)組先把原數(shù)組的每個(gè)值復(fù)制到一個(gè)新/另的數(shù)組,然后在新/另數(shù)組上進(jìn)行操作,所以不會(huì)改變?cè)瓟?shù)組的值。
- 2,如果參數(shù)不是數(shù)組,不管參數(shù)個(gè)數(shù)有多少個(gè),push()和concat()都會(huì)直接把參數(shù)添加到數(shù)組后;如果參數(shù)是一個(gè)數(shù)組,push()就會(huì)直接把數(shù)組添加到原數(shù)組后,而concat()會(huì)把數(shù)組里的值取出來添加到原數(shù)組后。
方法二: 使用toString先變成一個(gè)字符串再使用split變成一個(gè)字符串?dāng)?shù)組(數(shù)組中的每個(gè)元素是一個(gè)字符串),最后使用map方法將數(shù)組中的每個(gè)元素返回為非字符串。
//arr數(shù)組中的元素不能為字符串只能為數(shù)組 var newArr=arr.toString().split(',').map(function(ele){ return +ele; }); console.log(newArr) alert(typeof arr[0]); //number
方式三:使用toString()和split(',')方法
toString()
如果數(shù)組的元素都是數(shù)字,那么我們可以考慮使用 toString 方法,因?yàn)椋?br /> toString會(huì)將數(shù)組中的數(shù)以逗號(hào)形式結(jié)合起來。
toString()之后再split(',')轉(zhuǎn)成數(shù)組,并將其轉(zhuǎn)換回?cái)?shù)字?jǐn)?shù)組:
var arr = [1, [2, [3, 4],[5,[6],[7,8]]]]; var arrStr = arr.toString(); console.log(arrStr);//1,2,3,4,5,6,7,8 var strArr = arrStr.split(','); console.log(strArr)//["1", "2", "3", "4", "5", "6", "7", "8"]
方式二和方式三 的場(chǎng)景只適用于數(shù)組內(nèi)全部是數(shù)字的情況,因?yàn)橹虚g是全部轉(zhuǎn)換為字符串了。
方法四: 使用reduce和concat方法
Array.prototype.flatten=function(){ return this.reduce(function(prev, cur) { var moreArr = [].concat(cur).some(Array.isArray); //判斷cur是不是一個(gè)數(shù)組 return prev.concat(moreArr ? cur.flatten() : cur); },[]); }; var arr=a.flatten();
//合并二維數(shù)組 var twoArr = [['mu','zi'],['dig','big'],['lucky','jiji']]; var oneArr = twoArr.reduce(function(total,currentValue){ // console.log(total) return total.concat(currentValue); }) console.log(oneArr);//["mu", "zi", "dig", "big", "lucky", "jiji"]
reduce() 方法接收一個(gè)函數(shù)作為累加器,數(shù)組中的每個(gè)值(從左到右)開始縮減,最終計(jì)算為一個(gè)值。
reduce() 可以作為一個(gè)高階函數(shù),用于函數(shù)的 compose。
注意: reduce() 對(duì)于空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的。
var arr = [1,2,3,4,5,6,7,8,9,10] var str = arr.reduce(function(prev,cur,index,arr){ return prev + cur ; }) console.log(str)//55
方式五:es6擴(kuò)展運(yùn)算符
function flatten(arr){ while(arr.some(item=>Array.isArray(item)){ arr = [].concat(...arr); } return arr; }
由于擴(kuò)展運(yùn)算符一次只能展開一層數(shù)組:
var arr = [1, [2, [3, 4]]]; console.log([].concat(...arr)); // [1, 2, [3, 4]]
因此考慮只要數(shù)組中還有數(shù)組,就使用擴(kuò)展運(yùn)算符展開一次。
若有不足請(qǐng)多多指教!希望給您帶來幫助!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- JS數(shù)組合并push與concat區(qū)別分析
- JavaScript使用concat連接數(shù)組的方法
- JavaScript字符串對(duì)象的concat方法實(shí)例(用于連接兩個(gè)或多個(gè)字符串)
- JS數(shù)組方法concat()用法實(shí)例分析
- JavaScript中使用concat()方法拼接字符串的教程
- 深入理解javascript中concat方法
- javascript使用 concat 方法對(duì)數(shù)組進(jìn)行合并的方法
- Javascript連接多個(gè)數(shù)組不用concat來解決
- js采用concat和sort將N個(gè)數(shù)組拼接起來的方法
- javascript中數(shù)組的concat()方法使用介紹
- javascript concat數(shù)組累加 示例
- JS Array創(chuàng)建及concat()split()slice()的使用方法
- 淺談JavaScript的push(),pop(),concat()方法
- JavaScript模擬數(shù)組合并concat
- JS數(shù)組降維的實(shí)現(xiàn)Array.prototype.concat.apply([], arr)
- JavaScript中concat復(fù)制數(shù)組方法淺析
- javascript數(shù)組中的concat方法和splice方法
- JavaScript的concat方法實(shí)例代碼(數(shù)組連接)
相關(guān)文章
前端GET/POST請(qǐng)求下載文件多種方式代碼示例
文件都是通過接口獲取的,前端通過調(diào)用接口將接口返回的文件下載,下面這篇文章主要給大家介紹了關(guān)于前端GET/POST請(qǐng)求下載文件的多種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06手把手教你實(shí)現(xiàn)一個(gè)JavaScript時(shí)間軸組件
本文主要是給大家?guī)硪粋€(gè)時(shí)間軸的組件開發(fā)教程,其主要功能就是可以拖動(dòng)時(shí)間軸來定位當(dāng)前時(shí)間,可以通過鼠標(biāo)滾輪來修改當(dāng)前時(shí)間分辨率,需要的可以參考一下2022-10-10JavaScript實(shí)現(xiàn)的經(jīng)典文件樹菜單效果
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的經(jīng)典文件樹菜單效果,通過JavaScript結(jié)合json數(shù)組實(shí)現(xiàn)文件樹菜單的效果,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-09-09js實(shí)現(xiàn)收縮菜單效果實(shí)例代碼
這篇文章介紹了js實(shí)現(xiàn)收縮菜單效果實(shí)例代碼,有需要的朋友可以參考一下2013-10-10